一個32位小端轉大端的代碼:
錯誤代碼:
static to_big_dian(unsigned char * buff,int len)
{
int i = 0;
unsigned char tmp = 0;
if(len % 4 != 0)
{
printk("len must be 4x\n");
return -1;
}
for(i = 0 ; i < len; i+=4)
{
tmp = buff[i+0];
buff[i+0] = buff[i+3];
buff[i+1] = buff[i+2];
buff[i+2] = buff[i+1];
buff[i+3] = tmp;
}
return 0;
}
驗證代碼:
unsigned char test[8]= {1,2,3,4,5,6,7,8};
to_big_dian(test, 8);
for(x = 0;x<8;x++)
{
printk("%d \n",test[x]);
}
打印結果:
[80880.763063] 4
[80880.764752] 3
[80880.766414] 3
[80880.768076] 1
[80880.769819] 8
[80880.771484] 7
[80880.773146] 7
[80880.774807] 5
原因分析:
buff[i+1] = buff[i+2];
buff[i+2] = buff[i+1];
中間缺少tmp 保存 buff[i+1] 的值,導致後面取buff[i+1] 時已經是buff[i+2] 的值。
正確代碼:
static to_big_dian(unsigned char * buff,int len)
{
int i = 0;
unsigned char tmp = 0;
if(len % 4 != 0)
{
printk("len must be 4x\n");
return -1;
}
for(i = 0 ; i < len; i+=4)
{
tmp = buff[i+0];
buff[i+0] = buff[i+3];
buff[i+3] = tmp;
tmp = buff[i+1];
buff[i+1] = buff[i+2];
buff[i+2] = tmp;
}
return 0;
}
測試結果:
[81574.470622] 4
[81574.472313] 3
[81574.473976] 2
[81574.475637] 1
[81574.477298] 8
[81574.478959] 7
[81574.480684] 6
[81574.482350] 5