[英]Trying to pack a uint16 into 2 bytes of a byte array C#
我必須發送具有以下數據包結構的數據包:
1 byte padding (0x0)
2 byte (uint16) opcode
1 byte padding (0x0)
x bytes raw struct
因此,我需要一種將uint16放入字節數組的方法。
byte[] rawData = new byte[x+4];
rawData[0] = 0;
rawData[1] = (uint16-highbyte?) opcode;
rawData[2] = (uint16-lowbyte?) opcode;
rawData[1] = (byte) (opcode >> 8);
rawData[2] = (byte) opcode;
>>
是帶符號的右移運算符。 它將向右移動位,在左側重復最左邊的位,以保持帶符號的二補碼數字有效。
例如:
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | = 0x0301
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
0x0301 >> 8 =
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | = 0x0003
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
(byte)
強制轉換將僅保留數據的低8位。 所以:
+---+---+---+---+---+---+---+---+
(byte) (0x0301 >> 8) = | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | = 0x03
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
(byte) 0x0301 = | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | = 0x01
+---+---+---+---+---+---+---+---+
這是另一種方法。
fixed(short* ps = &rawData[1]){
*ps = opcode;
}
祝好運!
更新
兩者都產生相同的結果。
byte[] rawData = new byte[4];
short opcode = 16859;
fixed (void* ps = &rawData[1]) {
*(short*)ps = opcode;
}
Console.WriteLine(BitConverter.ToInt32(rawData, 0));
byte[] opBytes = BitConverter.GetBytes(opcode);
rawData = new byte[4];
rawData[1] = opBytes[0];
rawData[2] = opBytes[1];
Console.WriteLine(BitConverter.ToInt32(rawData, 0));
C#已經具備執行此操作的功能...。
BitConverter.GetBytes(opcode);
記錄在這里:-
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.