目的:
已知, int,short,char 等值类型, 在内存中都是以Byte为单位储存的(超过一Byte的以Byte数组形式储存), 有时需要直接操作内存时, 就需要知道这些值类型在内存中具体的储存方式, 包括Byte数组的顺序和数组内具体的机器数(一串0和1)
1.关于机器数: 机器数、真值、原码、反码、补码总结_十进制数负10的真值和机器数-CSDN博客
2. 首先把任意类型数值转化为Byte[]: (以ushort[即UInt16]类型为例)
UInt16 ush = 44444;
Byte[] Buff = BitConverter.GetBytes(ush);
因为UInt16是16位,Byte是8位, 所以GetBytes方法返回值是Length为2的Byte数组
3. 大小端概念
Console.WriteLine("是否是小端储存(LittleEndian):" + BitConverter.IsLittleEndian);
一般来说C#运行环境是小端, 小端是指当一个数值超过1Byte时, 它的高位Byte储存在内存地址高位
比如说ushort 类型的3, 在小端环境中的2个Byte分别是: 第一个Byte=00000011;第二个Byte=00000000;
用GetBytes方法得到2个成员的Byte数组, 索引0的Byte=3; 索引1的Byte=0;
所以上文中的44444变量"buff"里面存的是:
也就是: 156+173*256=44444
4. 打印成机器数的方法
static void ConsoleOutPut1N0(byte[] inputByteAryy)
{
byte[] CopiedArry=new byte[inputByteAryy.Length];//拷贝一份,避免影响原数组
Array.Copy(inputByteAryy, CopiedArry,inputByteAryy.Length);//成员是值类型,所以这里效果为DeepCopy
if (!BitConverter.IsLittleEndian) CopiedArry.Reverse();//不是小端则转为小端
for (int i = CopiedArry.Length - 1; i > -1; i--)//因为是小端,所以数组高index,对应内存中高位,对应高有效位,所以按照人类习惯高有效位在左边,这里从左往右打印,就要先打印数组中高index的Byte
{
byte item = CopiedArry[i];
for (int j = 7; j > -1; j--)//因为从左往右写, 所以从高位写起
{
Console.Write(item >> j & 1);
}
Console.Write(" ");
}
}
">>"是右移运算,目的是把高位移到"个位", 然后与00000001进行"&"(与)运算, 如果这个"高位"是1则打印出来1, 每一位分别打印.
这样就得到打印值: 10101101 10011100 , 分别是156和173
同样,int, char等类型也可以这样转化成机器数.