一、大小端
1、判断
简单来讲,低位数据存放于高地址则为大端,低地址则为小端。
我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
void IsBigEndian()
{
short int a = 0x1234;//十六进制,一个数值占4位
char b = *(char *)&a;
if (b == 0x12) {
// 大端模式
}
else {
// 小端模式
}
}
void IsBigEndian()
{
union U
{
short int a;
char b;
}temp;
temp.a = 0x1234;
if (temp.b == 0x12) {
// 大端模式
}
else {
// 小端模式
}
}
2、转换
// from caffe source code
uint32_t swap_endian(uint32_t val)
{
val = ((val << 8) & 0xFF00FF00 | (val >> 8) & 0xFF00FF);
return (val << 16) | (val >> 16) ;
}
uint_32 bswap_32(uint_32 x)
{
return (((uint_32)(x) & 0xff000000) >> 24) | \
(((uint_32)(x) & 0x00ff0000) >> 8) | \
(((uint_32)(x) & 0x0000ff00) << 8) | \
(((uint_32)(x) & 0x000000ff) << 24) ;
}