十六进制到 int 和返回给出不同的结果
hex to int and back gives different result
我得到一个 MAC 地址作为十六进制字符串“0009A8040060”,我想将最后 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
正在输出小字节序的字节 - 最不重要的字节在前。但是,当您使用 Convert.ToInt32
转换字符串“040060”时,可以将其视为使用大端字节序 - 第一个字节 04
被视为最高有效字节。这是因为 Convert.ToInt32
是为了解析“日常生活”中写的数字而设计的,而 big endian 就是我们在日常生活中写数字的方式。我们先写最高位。
因此,解决此问题的一种方法是在发送之前切换 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!
我得到一个 MAC 地址作为十六进制字符串“0009A8040060”,我想将最后 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
正在输出小字节序的字节 - 最不重要的字节在前。但是,当您使用 Convert.ToInt32
转换字符串“040060”时,可以将其视为使用大端字节序 - 第一个字节 04
被视为最高有效字节。这是因为 Convert.ToInt32
是为了解析“日常生活”中写的数字而设计的,而 big endian 就是我们在日常生活中写数字的方式。我们先写最高位。
因此,解决此问题的一种方法是在发送之前切换 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!