在C#中通过数据包发送HEX值

时间:2011-09-19 04:39:35

标签: c# networking packet

我目前有以下内容:

N.Sockets.UdpClient UD;

UD = new N.Sockets.UdpClient();
UD.Connect("xxx.xxx.xxx.xxx", 5255);
UD.Send( data, data.Length );

我如何以十六进制发送数据?我不能将它直接保存到字节数组中。

1 个答案:

答案 0 :(得分:1)

Hex只是一种编码。它只是一种表示数字的方式。计算机只使用位和字节 - 它没有“十六进制”的概念。

因此,无论以十六进制,十进制还是二进制表示,任何数字都可以编码为一系列字节:

var data = new byte[] { 0xFF };

任何十六进制字符串都可以转换为数字(例如使用int.Parse())。

当一个数字超过一个字节时,事情会变得更有趣:然后必须有一个协议,表示将使用多少字节来表示数字,以及它们应该处于的顺序。

在C#中,int是4个字节。在内部,根据CPU的endianness,最重要的字节(最高值数字)可能先存储(big-endian)或last(little-endian)。通常,big-endian用作通过网络进行通信的标准(请记住发送方和接收方可能具有不同字节序的CPU)。但是,既然你手动发送原始字节,我会假设你也在另一端手动读取原始字节;如果是这种情况,您当然可以自由使用您喜欢的任意格式,前提是客户可以明确地理解该格式。

要以big-endian顺序对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之间的主要实际区别),可能会导致错误解释字节。您应该采取措施来提高邮件发送的稳健性(例如,通过添加校验和,并忽略校验和无效或缺失的值)。