面试题目---小字节序、大字节序、程序判断 网络字节 主流机器字节序

小字节序:(比如x86体系) 数据的低字节放在低地址处,比如一个整型数0x12345678,在内存中的
          分布为:
                   -----------
                   |    78   | xxxx_0000
                   -----------
                   |    56   | xxxx_0001
                   -----------
                   |    34   | xxxx_0002
                   -----------
                   |    12   | xxxx_0003
                   -----------
                
                   Little Endian

大字节序:(比如PowerPC体系) 数据的低字节放在高地址处,比如一个整型数0x12345678,在内存中的
          分布为:
                   -----------
                   |    12   | xxxx_0000
                   -----------
                   |    34   | xxxx_0001
                   -----------
                   |    56   | xxxx_0002
                   -----------
                   |    78   | xxxx_0003
                   -----------
                
                   Big Endian

 

判断大字节序和小字节序
#include <stdio.h>
void main() {
   int i = 0x12345678;
   if(*(char *)&i == 0x12)
        printf("Big endian\n");
   else if(*(char *)&i == 0x78)
        printf("LIttle endian\n")
把高有效位放在低地址段为大字节序,把低有效位放在低地址段为小字节序。


判定方法:

    很多语言自带函数,但Linux还没找到,写个函数如下判断:

 

复制代码
bool  IsLittleEndian()
{
    union
    {
        
long  Long;
        
char  Char[ sizeof ( long )];
    } u;

    u.Long 
=   1 ;
    
if  (u.Char[ 0 ==   1 )
    {
        
return   true ;
    }
    
else   if  (u.Char[ sizeof ( long -   1 ==   1 )
    {
        
return   false ;
    }
    
else
    {
        
throw   " Unknown Addressing! " ;
    }
}
复制代码

 

 再上一个大小字节序转换函数:

 

void  EndianConvert(unsigned  int *  value)
{
    
* value  =   * value << 24   |  (( * value & 0xFF00 ) << 8 |  (( * value & 0xFF0000 ) >> 8 |  (( * value & 0xFF000000 ) >> 24 );
}

 




网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。

为了进行转换 bsd socket提供了转换的函数 有下面四个
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序

在使用little endian的系统中 这些函数会把字节序进行转换
在使用big endian类型的系统中 这些函数会定义成空宏

同样 在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug.

注:
1、网络与主机字节转换函数:htons ntohs htonl ntohl (s 就是short l是long h是host n是network)
2、不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表。
处理器     操作系统     字节排序
Alpha     全部     Little endian
HP-PA     NT     Little endian
HP-PA     UNIX     Big endian
Intelx86     全部     Little endian <-----x86系统是小端字节序系统
Motorola680x()     全部     Big endian
MIPS     NT     Little endian
MIPS     UNIX     Big endian
PowerPC     NT     Little endian
PowerPC     非NT     Big endian   <-----PPC系统是大端字节序系统
RS/6000     UNIX     Big endian
SPARC     UNIX     Big endian
IXP1200 ARM核心     全部     Little endian




网络字节序采用的是大端法。

主机字节序不同的CPU采用的方法不一样,可以通过代码来查看自己主机的字节序。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值