通过分组发送十六进制值在C#
问题描述:
目前,我有以下几点:通过分组发送十六进制值在C#
N.Sockets.UdpClient UD;
UD = new N.Sockets.UdpClient();
UD.Connect("xxx.xxx.xxx.xxx", 5255);
UD.Send(data, data.Length);
我怎么会在十六进制发送数据?我不能直接将它保存到一个Byte数组中。
答
十六进制只是一种编码。这只是表示数字的一种方式。计算机只处理位和字节 - 它没有“十六进制”的概念。
因此,任何数量的,无论是在十六进制或十进制或二进制表示的,可以被编码成一系列的字节:
var data = new byte[] { 0xFF };
而且任何十六进制字符串可被转换成一个数(使用例如int.Parse()
)。
,事情就当次数超过100个字节更有趣:那么必须有多少个字节将被用来表示数字的协议,他们的顺序应该是
在C#中,int
。 s是4个字节。在内部,取决于CPU的endianness,最重要的字节(最高位数字)可能先存储(大端)或最后(小端)。通常情况下,使用big-endian作为通过网络进行通信的标准(记住发送者和接收者可能具有不同的字节顺序的CPU)。但是,由于您手动发送原始字节,因此我假定您也正在另一端手动读取原始字节;如果是这样的话,你当然可以*使用你喜欢的任意格式,只要客户能够明白地理解这种格式。
要编码int
大端顺序,你可以这样做:
int num = 0xdeadbeef;
var unum = (uint)num; // Convert to uint for correct >> with negative numbers
var data = new[] {
(byte)(unum >> 24),
(byte)(unum >> 16),
(byte)(unum >> 8),
(byte)(unum)
};
要知道,有些分组可能永远不会到达客户端(这是TCP和UDP之间的主要实际差别),可能导致误解字节。您应该采取措施来提高消息发送的稳健性(例如,通过添加校验和,并忽略校验和无效或缺失的值)。
谢谢!我之前没有深入研究过十六进制! – Michael
@迈克尔:你看过并理解他的解释吗?十六进制只是表示数据的多种方式之一。这应该不会让你感到困惑:0xf == 017 == 1111 == 15。 –