字节序的转换
提供一種字節序轉換實現的思路。
假使在一臺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
總結
- 上一篇: 深度解析iPhone Category用
- 下一篇: spring中关于aop拦截功能的记录