(C#零基础)任意类型数值转机器数(0和1), 了解大小端概念

目的:

已知, 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等类型也可以这样转化成机器数.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值