zoukankan      html  css  js  c++  java
  • 判断.net中在windows系统下的字节序

      字节序,是指字节在内存中的存储顺序。其又分为大端字节(Big-Endian)序和小端字节序(Little-Endian)。

      以下摘自百度百科:

      a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

      b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

      什么意思呢?

      我们有一个int32的值:16909060,它的二进制表示方式是:0000 0001,0000 0010,0000 0011,0000 0100 (为了方便观看,我加了','号)

      那么,在内存中我们需要4个字节来保存这个整型数值。假设需要的内存地址为:0x00000001,0x00000002,0x00000003,0x00000004

      对于小端字节序,它的存放顺序为:

    0x00000001 0x00000002 0x00000003 0x00000004
    0000 0100 0000 0011 0000 0010 0000 0001

      对于大端字节序,它的存放顺序为:

    0x00000001 0x00000002 0x00000003 0x00000004
    0000 0001 0000 0010 0000 0011 0000 1000

      那么,在.net中是采用哪种字节序呢?

      先下结论:.net在内存中采用的是Little-Endian。 

      测试原理:利用 Buffer.BlockCopy 方法将一个int32位的值复制到int16值中。 Buffer.BlockCopy  方法将指定的count个数组从src复制到dst,并能指定开始复制的偏移位置。BlockCopy 方法使用内存的偏移量访问 src 参数数组中的字节,而不是使用索引或数组上下限等编程构造。注意,是内存的偏移量,即该方法是从内存中一个一个字节的复制值,而不是直接复制数值结构

      以下是源代码:

     1           var sours = new int[] { 175 };
     2             var dest = new short[1];
     3             var sp = 0; //源序列偏移地址
     4             var dp = 0; //目标位置偏移地址
     5             var count = 2; //一次拷贝字节数
     6 
     7             Buffer.BlockCopy(sours, sp, dest, dp, count);
     8             foreach (var i in dest)
     9             {
    10                 Console.WriteLine(i);
    11             }    

      结果输出:175.

      代码里一次复制2个字节,整好是一个int16所需要的字节大小。而源数组的起始偏移量是0.如果我们把sp的值改成2,即偏移2个字节,最后的输出就变成了0.这是因为175的高位字节是0000 0000,0000 0000,他存放在内存的高地址中。

  • 相关阅读:
    php 生成带图片的二维码
    ajax 请求 添加正在加载中 遮罩层
    uedit上传图片时文件选择框延迟弹出的解决方法
    gulp基本用法
    JS引擎的执行机制
    前端知识体系
    css基础
    gulp使用入门
    AngularJS最佳实践
    Restful API 待更新。。。
  • 原文地址:https://www.cnblogs.com/jidanfan/p/5364766.html
Copyright © 2011-2022 走看看