c# - 十六进制到 int 和返回给出不同的结果
问题描述
我得到了一个十六进制字符串“0009A8040060”的 MAC 地址,我想将最后 3 个字节转换为 int。然后我想把它隐藏起来。我以为我理解了十六进制转换的基础知识——但显然不是!
到目前为止我的尝试是
string endSerial = "0009A8040060".Substring(6);
int key = Convert.ToInt32(endSerial, 16);
关键是在那之后262240
。这似乎是正确的,但是当我使用服务器上运行的代码进行转换时(我无法更改)
int key = x; // receives over tcp. I´ve logged this int and its transferred ok!
string endSerial = BitConverter.ToString(BitConverter.GetBytes(Convert.ToUInt32(key))).Replace("-", "");
这给出了 endSerial = 60000400
。
我希望它是00040060
。似乎有某种反向问题?BitConverter.IsLittleEndian
虽然总是如此。
请帮忙
解决方案
通常,您不会使用BitConverter
,而只会这样做:
key.ToString("X6");
但是,显然您不能更改BitConverter
代码,所以这不是一个选项。
BitConveter
,正如您所发现的,是以小端序输出字节 - 首先是最低有效字节。但是,当您使用 转换字符串“040060”Convert.ToInt32
时,可以将其视为使用大端序 - 第一个字节04
被视为最高有效字节。这是因为Convert.ToInt32
它旨在解析以“日常生活”方式编写的数字,而大端是我们在日常生活中编写数字的方式。我们先写最重要的数字。
因此,解决此问题的一种方法是key
在发送之前切换字节顺序:
int key = Convert.ToInt32(endSerial, 16);
byte[] bytes = BitConverter.GetBytes(key);
Array.Reverse(bytes);
key = BitConverter.ToInt32(bytes, 0); // now it's in the right order!
推荐阅读
- jmeter - Jmeter beanshell采样器编写多行
- typescript - Angular 11如何获取子数组中的所有项目是否包含另一个给定数组中的项目
- python - Lambda 'ffprobe/avprobe 和 ffmpeg/avconv 未找到'上的 youtube_dl 错误。
- html - 在新选项卡中打开 PDF - Blazor
- spring-boot - Spring boot 和 opentelemetry:未实现:未知服务 opentelemetry.proto.collector.metrics.v1.MetricsService
- c# - MSChart,鼠标移动时在 Axe-Y2 上显示 Y 值
- amazon-s3 - DSS-S3 存储桶在基于时间的运行中红移-[Amazon](500310) 无效操作:清单文件中不存在强制 url
- python - 获取 SQLAlchemy 批量操作中的行数
- javascript - 正常吗,redux 创建这么多存储?
- cobalt - Cobalt 应用程序支持 Android 触摸屏设备