獨家bug 代碼(一)

一個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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章