因此,我目前正在try 了解更多关于endianness的知识,以及字节如何转换为Short、Int等.
我想我应该从简单开始,首先把一个短的("30000")
字节转换成两个字节,然后存储在一个MemoryStream
字节中
private static void WriteShort(short constValue)
{
_stream.WriteByte((byte)(constValue & 255));
_stream.WriteByte((byte)(constValue >> 8));
}
如果我理解正确,我首先使用按位and运算符&
进行位屏蔽.
0000 0000 1111 1111 &
0111 0101 0011 0000
这将导致一个字节看起来像0011 0000
,我会把它写到MemoryStream
.MemoryStream
包含一个字节数组,看起来像[48]
然后,我根据相同的值30000
写入另一个字节,但我将字节向右移位8,以获得最左边的8位0111 0101 (117)
,并将其作为字节写入MemoryStream
.现在字节数组看起来像这样
这一部分对我来说似乎很清楚,是对短片的重构让我有点困惑.
我为什么要在重建短片时做同样的位移位呢?我认为这个问题与我的另一个问题有点关联,"+"运算符如何将"48"和"117"转换为30000?
BitConverter.ToInt16(_stream.ToArray());
如何知道要移位什么字节等来输出正确的值?
private static short ReadShort()
{
_stream.Position = 0;
return (short)((_stream.ReadByte() & 255) +
(_stream.ReadByte() << 8));
}
整个计划
internal class Program
{
private static MemoryStream _stream;
static void Main(string[] args)
{
Console.WriteLine(117 << 8);
_stream = new MemoryStream();
short constValue = 30000;
WriteShort(constValue);
var v = ReadShort();
/* True */
Console.WriteLine($"Is Little Endian: {BitConverter.IsLittleEndian}");
}
private static void WriteShort(short constValue)
{
_stream.WriteByte((byte)(constValue & 255));
_stream.WriteByte((byte)(constValue >> 8));
}
private static short ReadShort()
{
_stream.Position = 0;
return (short)((_stream.ReadByte() & 255) +
(_stream.ReadByte() << 8));
}
}