大端模式到到小端模式的转换

 

一、字节序定义

字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。

其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。

在所有的介绍字节序的文章中都会提到字节序分为两类:Big- Endian和Little-Endian。引用标准的Big-Endian和Little-Endian的定义如下:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

二、维基百科解释

字节序,又称端序尾序,英文:Endianness。在计算机科学领域中,字节序是指存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。Endianness有时候也可以用指位序(bit)。

一般而言,字节序指示了一个UCS-2字符的哪个字节存储在低地址。如果LSByteMSByte的前面,即LSB为低地址,则该字节序是小端序;反之则是大端序。在网络编程中,字节序是一个必须被考虑的因素,因为不同的处理器体系可能采用不同的字节序。在多平台的代码编程中,字节序可能会导致难以察觉的bug

三、转换代码


DWORD ToLittleEndian(DWORD dwBigEndian)
{
    BYTE* p = (BYTE*)&dwBigEndian;
    return (DWORD)(p[0]<< 24)+ (DWORD)(p[1]<< 16)+
        (DWORD)(p[2]<< 8)+(DWORD)p[3];
}


以上代码不仅适合大端向小端转换,也适合从小端到大端转换。

author: thinker
e-mail: cnhnyu<AT>gmail.com
qq: 94483026

 

以下是我的源代码:

#include  <stdlib.h>
#include <iostream>
#include <Windows.h>

int checkCPUendian()
{
 union
 {
  unsigned int a;
  unsigned char b; 
 }c;
 c.a = 1;
 return (c.b == 1); 
} 

DWORD ToLittleEndian(DWORD dwBigEndian)
{
 BYTE* p = (BYTE*)&dwBigEndian;
 return (DWORD)(p[0] << 24) + (DWORD)(p[1] << 16) + (DWORD)(p[2] << 8) + (DWORD)p[3];
}

void  main()
{
 int b;
 DWORD d , dd;

 dd = 16777216;

 d = ToLittleEndian(dd);
 std::cout<<d<<std::endl;

 if(0 == checkCPUendian())
 {
  b = 0;
  std::cout<<"biger"<<b<<std::endl;
 }
 if(1 == checkCPUendian())
 {
  b = 1;
  std::cout<<"litet"<<b<<std::endl;
 }
}


 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值