字节序的转换

提供一种字节序转换实现的思路。

假使在一台64位的机器上定义的整数int val=0x01020304,转换之后为0x04030201

(BIG-ENDIAN、LITTLE-ENDIAN跟多字节类型的数据有关的比如int,short,long型,

而对单字节数据byte却没有影响。BIG-ENDIAN就是低位字节排放在内存的低端,高位字节排放在内存的高端。而LITTLE-ENDIAN正好相反。

比如 int a = 0x05060708

在BIG-ENDIAN的情况下存放为:

字节号 0 1 2 3

数据 05 06 07 08

在LITTLE-ENDIAN的情况下存放为:

字节号 0 1 2 3

数据 08 07 06 05 )

 

思路:使用单字节的字符指针解释多字节的内存地址。

空间上,只需要多字节类型长度的存储空间;时间上,无需通过算术运算保存各字节的十六进制值,再做移位异或等操作得到转换结果,提高了效率。

实现:

//revert.cpp

#include <iostream>
#include <cstdlib>
using namespace std;

unsigned char* revert(unsigned char *pVal, int size)
{
 unsigned char *byte_arr;
 byte_arr = (unsigned char*) malloc (size);

 if(NULL == byte_arr)
 {
  cout<<"memory allocation fail. exit..."<<endl;
 }

 for(int i=0; i<size; i++)
 {
  //cout<<hex<<(unsigned int)*(pVal+i)<<endl;
  byte_arr[size-1-i] = (unsigned int)*(pVal+i);
 }

 return byte_arr;
}

int main(void)
{
 int val1 = 0x01020304;
 int *pInt = (int*)revert((unsigned char*)&val1, sizeof(val1));
 cout<<hex<<*pInt<<endl;

 short val2 = 0x0102;
 short *pShort = (short*)revert((unsigned char*)&val2, sizeof(val2));
 cout<<hex<<*pShort<<endl;
 
 
 long val3 = 0x0102030405060708;
 long *pLong = (long*)revert((unsigned char*)&val3, sizeof(val3));
 cout<<hex<<*pLong<<endl;

 return 0;
}

 

图示:

 

转载于:https://www.cnblogs.com/iamonmyway/archive/2012/02/14/2350249.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值