将变量添加到十六进制流中



在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());
}

我怎么用语法?

如果你有一个固定大小的字节数组,你可以这样做:

Byte[] sendBytes = new byte[] { 
0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xff, 0x81, 0x01, 
0x04, 0x07, 0x00, 0xFF 
};
sendBytes[12] = (byte) trackbar.value;

但是:如果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((,但我认为了解一些细节不会有什么坏处;(

最新更新