我目前有以下内容:
N.Sockets.UdpClient UD;
UD = new N.Sockets.UdpClient();
UD.Connect("xxx.xxx.xxx.xxx", 5255);
UD.Send( data, data.Length );
我如何以十六进制发送数据?我不能将它直接保存到字节数组中。
答案 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之间的主要实际区别),可能会导致错误解释字节。您应该采取措施来提高邮件发送的稳健性(例如,通过添加校验和,并忽略校验和无效或缺失的值)。