用c#在数据包上发送十六进制值

本文关键字:十六进制 数据包 | 更新日期: 2023-09-27 18:09:02

我目前有以下内容:

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

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

用c#在数据包上发送十六进制值

十六进制只是一种编码。它只是一种表示数字的方法。计算机只处理位和字节——它没有"十六进制"的概念。

所以任何数字,无论是十六进制、十进制还是二进制,都可以被编码成一系列字节:

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

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

当一个数字超过一个字节时,事情变得更有趣了:然后必须就使用多少字节来表示该数字以及它们应该以何种顺序达成协议。

在c#中,int是4个字节。在内部,根据CPU的端序,最高有效字节(最高值的数字)可能存储在第一个(大端)或最后一个(小端)。通常,大端编码被用作网络通信的标准(请记住,发送方和接收方的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之间的主要实际区别),可能导致字节的误解。您应该采取措施来提高消息发送的健壮性(例如,通过添加校验和,并忽略校验和无效或缺失的值)。