C# 十六进制到int和back给出不同的结果

C# 十六进制到int和back给出不同的结果,c#,hex,C#,Hex,我得到了一个十六进制字符串“0009A8040060”的MAC地址,我想把最后3个字节转换成int。然后我想把它转换回来。我以为我理解了十六进制转换的基本原理——但显然不是 到目前为止,我的尝试是失败的 string endSerial = "0009A8040060".Substring(6); int key = Convert.ToInt32(endSerial, 16); 键位于该键之后262240。这似乎是正确的,但当我使用服务器上运行的代码转换它时(我无法更改)

我得到了一个十六进制字符串“0009A8040060”的MAC地址,我想把最后3个字节转换成int。然后我想把它转换回来。我以为我理解了十六进制转换的基本原理——但显然不是

到目前为止,我的尝试是失败的

string endSerial = "0009A8040060".Substring(6);
int key = Convert.ToInt32(endSerial, 16);
键位于该键之后
262240
。这似乎是正确的,但当我使用服务器上运行的代码转换它时(我无法更改)

这使得endSerial=
60000400

我希望它是
00040060
。似乎存在某种相反的问题<但code>BitConverter.IsLittleEndian始终为真


请帮助

通常,您不会使用
位转换器
,只需执行以下操作:

key.ToString("X6");
但是,显然您无法更改
位转换器
代码,因此这不是一个选项


比特转换器
,正如您所发现的那样,正在以小尾端输出字节—最低位字节。但是,当您使用
Convert.ToInt32
转换字符串“040060”时,可以将其视为使用大端字节-第一个字节
04
被视为最高有效字节。这是因为
Convert.ToInt32
设计用于解析以“日常生活”方式编写的数字,而big-endian是我们在日常生活中编写数字的方式。我们先写最重要的数字

因此,解决此问题的一种方法是在发送前切换
键的字节顺序:

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!

通常,您不会使用
位转换器
,只需执行以下操作:

key.ToString("X6");
但是,显然您无法更改
位转换器
代码,因此这不是一个选项


比特转换器
,正如您所发现的那样,正在以小尾端输出字节—最低位字节。但是,当您使用
Convert.ToInt32
转换字符串“040060”时,可以将其视为使用大端字节-第一个字节
04
被视为最高有效字节。这是因为
Convert.ToInt32
设计用于解析以“日常生活”方式编写的数字,而big-endian是我们在日常生活中编写数字的方式。我们先写最重要的数字

因此,解决此问题的一种方法是在发送前切换
键的字节顺序:

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!

我很确定
BitConverter.ToString(uint)
不能提供6个字符的字符串。你想改成
00040060
吗?是的,很好@清洁工。已编辑。
key.ToString(“X8”)
是否适用于您的目的?我很确定
BitConverter.ToString(uint)
不能为您提供6个字符的字符串。你想改成
00040060
吗?是的,很好@清洁工。已编辑。
key.ToString(“X8”)
是否适用于您的目的?谢谢!是的,显然tcp连接上的所有内容都是通过little endian发送的。他们错误地使用了相同的转换器。所以,正如你所说,正确的做法是将其反向发送。谢谢!是的,显然tcp连接上的所有内容都是通过little endian发送的。他们错误地使用了相同的转换器。所以,正如你所说,正确的做法是将其反向发送。