2012-07-13 149 views
2

所以我很好奇,這裏究竟發生了什麼?位移c#這裏發生了什麼?

static void SetUInt16 (byte [] bytes, int offset, ushort val) 
{ 
    bytes [offset] = (byte) ((val & 0x0ff00) >> 8); 
    bytes [offset + 1] = (byte) (val & 0x0ff); 
} 

基本上在這段代碼的想法是在特定的位置設置一個16位的整型成一個字節的緩衝區,但問題是我想用效仿

using(var ms = new MemoryStream()) 
using(var w = new BinaryWriter(ms)) 
{ 
    w.Write((ushort)1); 
} 

我米期待讀1,但我得到256。這是一個排序問題?

回答

5

該代碼以big-endian順序寫入一個16位整數。高字節先寫入。與BinaryWriter不同的是,它以小端順序寫入。

+0

這就是我所假設的,只是不完全理解按位操作等。 – 2012-07-13 21:00:35

+0

這不是一個操作,只是在這裏洗牌字節。 Skeet寫了一個bigendian作家類:http://www.yoda.arachsys.com/csharp/miscutil/ – 2012-07-13 21:02:41

+1

所以我可以這麼做,'w.Write((byte)((val&0x0ff00)>> 8) )'然後'w.Write((byte)(val&0x0ff))',因爲它只是在翻轉它們呢? – 2012-07-13 21:07:52

3

當你解碼數據時,你預計1時是256嗎?​​使用little-endian編碼,您的SetUInt16方法使用big-endian。

相關問題