【问题标题】:hex to int and back gives different result十六进制到 int 和返回给出不同的结果
【发布时间】:2021-06-11 03:56:17
【问题描述】:

我得到了一个十六进制字符串“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.ToString(uint) 不能给你一个 6 个字符的字符串。你想要00040060 代替吗?
  • 是的,没问题! @Sweeper。已编辑。
  • key.ToString("X8") 是否适合您的目的?

标签: c# hex


【解决方案1】:

通常,您不会使用BitConverter,而是会这样做:

key.ToString("X6");

但是,显然您不能更改 BitConverter 代码,所以这不是一个选项。


BitConveter,正如您所发现的,以小端序输出字节 - 首先是最低有效字节。但是,当您使用Convert.ToInt32 转换字符串“040060”时,可以将其视为使用大端序——第一个字节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!

【讨论】:

  • 谢谢!是的,显然 tcp 连接上的所有内容都是以小端序发送的。他们错误地为此使用了相同的转换器。如此正确 - 正如你所说 - 以相反的方式发送。
猜你喜欢
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 2011-12-09
  • 2018-05-16
  • 2017-12-10
  • 1970-01-01
相关资源
最近更新 更多