码迷,mamicode.com
首页 > 其他好文 > 详细

字节转换之大小端

时间:2015-06-17 18:21:11      阅读:822      评论:0      收藏:0      [点我收藏+]

标签:ultraedit   byte   int32   转换   大小端   

今天有个任务是将字节文件转换成整型,我是采用C#的BinaryReader.ReadInt32来直接读取的,运行结果也很顺利,整型结果是1577,但是好奇心驱使我用Ultraedit打开了源文件,但是我发现16进制存储的数组是这样的
技术分享

这是什么鬼…,读取结果:

0x29060000=0*16^0+0*16^1+0*16^2+0*16^3+6*16^4+0*16^5+9*16^6+2*16^7=688259072

这和1577完全不搭嘎啊,都溢出了…

于是乎问大牛,查资料,得知这是大小端问题,我的是小端,低位存低位地址,高位存高位地址。
读取的正确结果应该是:
0x00000629=9*16^0+2*16^1+6*16^2=1577

大端:高位存在低地址,低位存在高地址;
小端:高位存在高地址,低位存在低地址;(intel的x86,ARM普遍都是属于小端)

查询自己机器到底是大端还是小端的方法也不复杂
C#自带BitConverter封装的IsLittleEndian判断

//判断大小端(BigEndian - LittleEndian, C#/Win小端,Java大端,网络传输大端)
        //数字或Unicode区分大小端(2的倍数的字节数)
        bool isLittle = BitConverter.IsLittleEndian;

        //数字
        //方法一
        int c = 97;
        byte[] cb = BitConverter.GetBytes(c);//小端
        Array.Reverse(cb);//反转成大端

        //方法二
        int c2 = IPAddress.HostToNetworkOrder(c);//大端字节数
        byte[] bb = System.BitConverter.GetBytes(c2);//字节数组

        //文本(Unicode)
        string s = "code";
        byte[] sbb = Encoding.BigEndianUnicode.GetBytes(s);//大端
        byte[] sbs = Encoding.Unicode.GetBytes(s);//小端

C++判断也简单,采用Union的方式判断,因为在Union中所有的元素都放在一块内存空间中,mu.c的内存地址是和int型的变量i的起始地址对齐的,所以改变int型的值mu.i=1,如果为小端存储,则mu.c==1,反之,则为大端存储。详细可以参考:http://blog.csdn.net/anialy/article/details/8015183

void checkSystemBigOrLittle(void) 
{ 
    typedef union MyUnion 
    { 
        int i; 
        char c; 
    }; 

    MyUnion mu; 

    mu.i = 1; 

    if(mu.c == 1) 
    {
        printf("小端存储模式");
    } 
    else if (mu.c == 0) 
    { 
        printf("大端存储模式");
    } 
    else
    {
        printf("很抱歉,出错了");
    } 
} 

上文是各种被大牛喷的结果,后来的童鞋们请打牢基础,被喷请自查…

字节转换之大小端

标签:ultraedit   byte   int32   转换   大小端   

原文地址:http://blog.csdn.net/natahew/article/details/46535843

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!