您好,我对C#编程比较陌生,并希望得到一些帮助,我正在编写一个程序,通过RS232与机器通信,需要发送一系列字节来启动COM。我在数据包的末尾有一个双字节16位CRC字,我认为我需要将其分成两个字节以适应字节数组
// { <DLE> , <STX> , "G" , <DLE> , <ETX> , 16 BIT CRC CCITT split into two bytes}
byte[] byteToSend = new byte[] { 0x10, 0x02, 0x47, 0x10, 0x03, 0x421F };
当我将0x421F转换为二进制并将其分成两半时,我得到0x42和0x1F 然而,不太重要的字节0x1F的问题是当它被发送时,它没有填充足够的零。我认为它只是发送为&lt; 11111&gt;而不是&lt; 00011111&gt;根据需要。
任何帮助都会非常感激 谢谢 :)
答案 0 :(得分:2)
byte[] byteToSend = new byte[] { 0x10, 0x02, 0x47, 0x10, 0x03, 0x1F, 0x42 }
-----^
或者使用BitConverter(理解字节顺序):
var bytes = BitConverter.GetBytes(0x421F);
答案 1 :(得分:0)
byte[] byteToSend = new byte[] { 0x10, 0x02, 0x47, 0x10, 0x03, 0x1F, 0x42 }
-----^
如果目标计算机需要little-endian(可能是x86),则需要翻转字节。如果它是big-endian,请使用
byte[] byteToSend = new byte[] { 0x10, 0x02, 0x47, 0x10, 0x03, 0x42, 0x1F }
-----^
罗伯特哈维写道。
(如果您不确定字节顺序,请尝试两者。)
答案 2 :(得分:0)
这是对的吗?
ushort value = 0x421F;
byte value1 = (byte)(0x421F & 0xFF);
byte value2 = (byte)(0x421F >> 8);