将变量添加到十六进制流

时间:2018-12-16 09:25:01

标签: c# variables hex

在C#中,我想将trackbar.value中的变量添加到十六进制流中:

            UdpClient udpClient = new UdpClient("192.168.1.205", 52381);=
        Byte[] sendBytes = new byte[] { 
            0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xff, 0x81, 0x01, 
            0x04, 0x07, 0x0("trackbar.value"), 0xFF 
        };

        try
        {
            udpClient.Send(sendBytes, sendBytes.Length);
        }
        catch (Exception)
        {
            Console.WriteLine(e.ToString());
        }

我该怎么语法呢?

1 个答案:

答案 0 :(得分:0)

如果您有固定大小的字节数组,则可以执行以下操作:

Byte[] sendBytes = new byte[] { 
    0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xff, 0x81, 0x01, 
    0x04, 0x07, 0x00, 0xFF 
    };

sendBytes[12] = (byte) trackbar.value;

BUT:当然,如果您的trackbar.value不是字节值并且超过最大值255,则当然会导致数据丢失。 因此,您将不得不降低精度并扩展您的价值,就像这样:

byte scaledValue = (byte) ((double) trackbar.value / [maximum_trackbar_value] * 255.0);

或增加消息中用于传输值的字节数。
例如,使用最大值为65535(= 2 ^ 16-1)的16位整数将需要2个字节。要将您的值“拆分”为这2个字节,您将需要像这样进行移位

1. sendBytes[12] = (byte) trackbar.value;
2. sendBytes[13] = (byte) (trackbar.value >> 8);

第二行将值的最高8位向右移动,以便可以将它们放入下一个字节,该字节只能用于8位,其余部分将被截断。为了更好地理解:

1. (byte) (00000101 00111001) = 00111001
2. (byte) ((00000101 00111001) >> 8) = (byte) (00000000 00000101) = 00000101

这将以小端顺序传送您的值,这意味着数组中的低位字节(“较小值”)首先出现。您可以在https://en.wikipedia.org/wiki/Endianness上找到有关该主题的更多详细信息。您邮件的接收者必须做相反的事情:

int trackbarValue = (receivedBytes[12] & 0xFF) | ((receivedBytes[13] & 0xFF) << 8);

这里有两个函数可以使它更加通用:

public static byte[] GetBytesLittleEndian(int num, int byteCount)
{
    var result = new byte[byteCount];

    for (int i = 0; i < byteCount; i++)
    {
        result[i] = (byte)(num >> (i * 8));
    }

    return result;
}

public static int ParseLittleEndian(byte[] data, int byteCount)
{
    int parsed = 0;

    for (int i = 0; i < byteCount; i++)
    {
        parsed |= data[i] << (i * 8);
    }

    return parsed;
}

当然有内置功能,例如,请参阅BitConverter.GetBytes(),但我认为知道一些细节不会有什么害处;)