如何将单独的 int 值转换为十六进制字节数组
How do I convert separate int values to hex byte array
我需要做一些(对我来说是新的)int/hex/byte 工作,我正在努力把它做好。另一端的 tcp 服务器期待 Little Endian。
我需要发送一个由十六进制值组成的字节数组。
6000
需要发送为:
0x70, 0x17
19
需要发送为:
0x13, 0x00, 0x00, 0x00
生成的字节数组应如下所示。
**FROM THE MANUFACTURER**
Complete message should be:
0x70, 0x17, 0x13, 0x00, 0x00, 0x00, 0x40, 0x42, 0x0f, 0x00, 0xA0, 0x86, 0x01, 0x00, 0x04, 0x01, 0x02, 0x03, 0x04
我可以使用 .ToString("x4")
将 6000
的十六进制值作为 1770
我可以使用 .ToString("x8")
将 19
的十六进制值设为 00000013
我有两个问题:
这(据我所知)是 Big Endian。除了截断字符串并手动重写它以反转它之外,是否有可以为我执行此操作的 .net 例程?
一旦我反转了,我怎么得到
7017
在字节数组中:
[0] = 0x70, [1] = 0x17
提前致谢。
可以使用BitConverterclass来实现转换。
结果实际上已经在您需要的约定中。无需回滚
byte[] res6000 = BitConverter.GetBytes(6000);
byte[] res19 = BitConverter.GetBytes(19);
// TEST OUTPUT for example
Console.WriteLine(" 6000 -> : " + String.Join("", res6000.Select(x => x.ToString("X2"))));
Console.WriteLine(" 19 -> : " + String.Join("", res19.Select(x=>x.ToString("X2"))));
输出:
6000 -> : 70170000
19 -> : 13000000
这里有一个小方法可以完成这项工作,字节数是您想要的:
public byte[] TransformBytes(int num, int byteLength)
{
byte[] res = new byte[byteLength];
byte[] temp = BitConverter.GetBytes(num);
Array.Copy(temp, res, byteLength);
return res;
}
然后你可以调用它并将结果合并到一个列表中,如下所示:
List<byte> allBytesList = new List<byte>();
allBytesList.AddRange(TransformBytes( 6000, 2));
allBytesList.AddRange(TransformBytes( 19, 4));
allBytesList.AddRange(TransformBytes(1000000, 4));
allBytesList.AddRange(TransformBytes( 100000, 4));
allBytesList.AddRange(TransformBytes( 4, 1));
Console.WriteLine(" All -> : " + String.Join(" ", allBytesList.Select(x => x.ToString("X2"))));
输出:
All -> : 70 17 13 00 00 00 40 42 0F 00 A0 86 01 00 04
最后的List<byte>
可以很方便的转换为数组:
byte [] b_array = allBytesList.ToArray();
我需要做一些(对我来说是新的)int/hex/byte 工作,我正在努力把它做好。另一端的 tcp 服务器期待 Little Endian。
我需要发送一个由十六进制值组成的字节数组。
6000
需要发送为:
0x70, 0x17
19
需要发送为:
0x13, 0x00, 0x00, 0x00
生成的字节数组应如下所示。
**FROM THE MANUFACTURER**
Complete message should be:
0x70, 0x17, 0x13, 0x00, 0x00, 0x00, 0x40, 0x42, 0x0f, 0x00, 0xA0, 0x86, 0x01, 0x00, 0x04, 0x01, 0x02, 0x03, 0x04
我可以使用 .ToString("x4")
将 6000
的十六进制值作为 1770
我可以使用 .ToString("x8")
19
的十六进制值设为 00000013
我有两个问题:
这(据我所知)是 Big Endian。除了截断字符串并手动重写它以反转它之外,是否有可以为我执行此操作的 .net 例程?
一旦我反转了,我怎么得到
7017
在字节数组中:
[0] = 0x70, [1] = 0x17
提前致谢。
可以使用BitConverterclass来实现转换。 结果实际上已经在您需要的约定中。无需回滚
byte[] res6000 = BitConverter.GetBytes(6000);
byte[] res19 = BitConverter.GetBytes(19);
// TEST OUTPUT for example
Console.WriteLine(" 6000 -> : " + String.Join("", res6000.Select(x => x.ToString("X2"))));
Console.WriteLine(" 19 -> : " + String.Join("", res19.Select(x=>x.ToString("X2"))));
输出:
6000 -> : 70170000
19 -> : 13000000
这里有一个小方法可以完成这项工作,字节数是您想要的:
public byte[] TransformBytes(int num, int byteLength)
{
byte[] res = new byte[byteLength];
byte[] temp = BitConverter.GetBytes(num);
Array.Copy(temp, res, byteLength);
return res;
}
然后你可以调用它并将结果合并到一个列表中,如下所示:
List<byte> allBytesList = new List<byte>();
allBytesList.AddRange(TransformBytes( 6000, 2));
allBytesList.AddRange(TransformBytes( 19, 4));
allBytesList.AddRange(TransformBytes(1000000, 4));
allBytesList.AddRange(TransformBytes( 100000, 4));
allBytesList.AddRange(TransformBytes( 4, 1));
Console.WriteLine(" All -> : " + String.Join(" ", allBytesList.Select(x => x.ToString("X2"))));
输出:
All -> : 70 17 13 00 00 00 40 42 0F 00 A0 86 01 00 04
最后的List<byte>
可以很方便的转换为数组:
byte [] b_array = allBytesList.ToArray();