通过分组发送十六进制值在C#

通过分组发送十六进制值在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之间的主要实际差别),可能导致误解字节。您应该采取措施来提高消息发送的稳健性(例如,通过添加校验和,并忽略校验和无效或缺失的值)。

+0

谢谢!我之前没有深入研究过十六进制! – Michael

+0

@迈克尔:你看过并理解他的解释吗?十六进制只是表示数据的多种方式之一。这应该不会让你感到困惑:0xf == 017 == 1111 == 15。 –