2012-07-13 108 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。

相关问题