如何将独立的整数值转换为十六进制字节数组

3
我需要进行一些关于int/hex/byte的工作,但是我很难做到正确。另一端的tcp服务器期望使用小端模式。
我需要发送一个由HEX值组成的字节数组。 6000 需要被发送为:

0x70, 0x17

19 需要被发送为:

0x13, 0x00, 0x00, 0x00

parameters

生成的字节数组应该是这样的。
**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

我可以使用以下代码将6000的十六进制值转换为1770:.ToString("x4")。我可以使用以下代码将19的十六进制值转换为00000013:.ToString("x8")
我有两个问题:
1. 这(据我所知)是大端序。除了剪切字符串并手动重写以反转它之外,是否有一个.NET例程可以为我执行此操作? 2. 一旦我把它反转过来,如何在以下字节数组中获得7017[0] = 0x70,[1] = 0x17
谢谢。

你需要以哪种格式结束?从6000开始,它应该以 byte[] {0x70, 0x17} 结束。 - Mong Zhu
你是否正在发送原始字节?那么 BitConverter.GetBytes(value); 比字符串更适合。一旦你有了一个字节数组,只需调用 Array.Reverse(bytes); 来反转你的字节。 - fairtrax
你发送的是格式化字符串还是字节?0x70,0x17等只是字节的可读形式,但“在传输中”的字节需要每个字节占用1个字节,而不是4个(0x17表示23等)。如果你真的要格式化它们并发送由逗号分隔的字符串,请使用下面Mong Zhu的代码。 - fairtrax
使用 BitConverter.GetBytes(value); 将数据转换为字节数组,然后将其反转以获取小端序,并发送到 TCP/IP 流。 - fairtrax
根据您的消息格式,您的消息ID需要2个字节。 GetBytes(int)始终检索4个字节,您可以使用其中任何一个,例如bytes [0]等。 - fairtrax
显示剩余8条评论
1个回答

2
您可以使用 BitConverter 类进行转换。 结果已经符合您需要的规范,无需反转。
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"))));

输出:

所有 ->:70 17 13 00 00 00 40 42 0F 00 A0 86 01 00 04

List<byte> 可以很容易地最终转换为数组:

byte [] b_array = allBytesList.ToArray();

非常感谢您提供如此详细的答案!我们非常感激。至少现在服务器正在返回一些数据。接下来是读取这些数据的下一个挑战。 谢谢! - Louis van Tonder
1
@LouisvanTonder 没问题,祝你在服务器聊天中好运 ;) - Mong Zhu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接