将包含十六进制值的字节数组转换为十进制值
Posted
技术标签:
【中文标题】将包含十六进制值的字节数组转换为十进制值【英文标题】:Conversion of byte array containing hex values to decimal values 【发布时间】:2011-12-31 07:01:09 【问题描述】:我在 c# 中进行应用程序。这里我想。假设我有一个字节数组作为
array[0]=0X4E;
array[1]=0X5E;
array[2]=0X75;
array[3]=0X49;
在这里,我想将该十六进制数组转换为十进制数,就像我想首先将所有字节值连接为 4E5E7549,然后将该数字转换为十进制数。我不想将每个单独的十六进制数转换为十进制数。十进制等效该十六进制数是 1314813257。所以请帮助我。提前致谢。
【问题讨论】:
BitConverter.ToInt32() 是为了做到这一点。尽管您确实必须观察 little-endian 字节顺序。 Array.Reverse() 如果必须的话。 【参考方案1】:BitConverter.ToInt32 方法是一个很好的方法
if (BitConverter.IsLittleEndian)
Array.Reverse(array); //need the bytes in the reverse order
int value = BitConverter.ToInt32(array, 0);
【讨论】:
reversing 给出了绝对需要的结果,但我不明白为什么我们必须进行反转,我可能会遗漏一些观点,但在我看来,数组中的最后一个字节应该代表数字的低字节,对吧? 在这里得到了答案betterexplained.com/articles/…【参考方案2】:十六进制和十进制只是表示您想要的相同数据的不同方式
int myInt = array[0] | (array[1] << 8) | (array[2] << 16) | (array[3] <<24)
【讨论】:
我试过了,但我作为操作员遇到了错误 ||不能应用于 byte 和 int 类型的操作数 哎呀,已修复,因此它们不再合乎逻辑。【参考方案3】:下面是一个将包含十六进制数的字符串转换为十进制整数的方法:
private int HexToDec(string hexValue)
char[] values = hexValue.ToUpperInvariant().ToCharArray();
Array.Reverse(values);
int result = 0;
string reference = "0123456789ABCDEF";
for (int i = 0; i < values.Length; i++)
result += (int)(reference.IndexOf(values[i]) * Math.Pow(16d, (double)i));
return result;
然后您可以将这些片段串在一起并将它们传递给此函数以获取十进制值。如果您使用非常大的值,您可能需要从 int 更改为 ulong。
【讨论】:
@JeremyChild 是的,十进制整数。十进制含义以 10 为底。【参考方案4】:注意字节顺序。
int num =
array[0] << 8 * 3 |
array[1] << 8 * 2 |
array[2] << 8 * 1 |
array[3] << 8 * 0;
【讨论】:
【参考方案5】:您可以使用IPAddress.NetworkToHostOrder(value)
,而不是自己检查IsLittleEndian
。
int value = BitConverter.ToInt32(array, 0);
value = IPAddress.NetworkToHostOrder(value);
查看更多:
https://docs.microsoft.com/de-de/dotnet/api/system.net.ipaddress.networktohostorder?redirectedfrom=MSDN&view=netframework-4.7.2#System_Net_IPAddress_NetworkToHostOrder_System_Int32_
【讨论】:
以上是关于将包含十六进制值的字节数组转换为十进制值的主要内容,如果未能解决你的问题,请参考以下文章
如何将Mac地址转换为十六进制并将其传递给java中的字节数组