字节序的转换
提供一种字节序转换实现的思路。
假使在一台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;
}
图示: