簡體   English   中英

嘗試將uint16打包到字節數組C#的2個字節中

[英]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);

記錄在這里:-

http://msdn.microsoft.com/en-us/library/fk3sts66.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM