最近軟體設計用到了一個需要大小端轉換的問題,本來想搜尋下看看有沒有現成的庫檔案或者代碼,後來沒有找到合适的。至少,沒有找到我喜歡的吧!還是自己動手做個吧!
其實,核心的功能可以做成位元組交換。是以,先實作一個位元組交換功能。
void byte_swap(uint8_t *a, uint8_t *b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
測試了一下,功能OK。
接下來實作16bit的交換:
void byte_swap16(void *a)
{
byte_swap(a, a + 1);
}
測試程式:
#include <stdio.h>
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
void byte_swap(uint8_t *a, uint8_t *b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
void byte_swap16(void *a)
{
byte_swap(a, a + 1);
}
int main(void)
{
uint16_t var1 = 0xABCD;
byte_swap16(&var1);
printf("a = %x\n", var1);
byte_swap16(&var1);
printf("a = %x\n", var1);
return 0;
}
運作結果OK:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iN5AjN3ETOwITZmV2YjNDZxYzXxMDOyITM0AzLcFDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
增加一個有符号的測試:
#include <stdio.h>
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef short int16_t;
void byte_swap(uint8_t *a, uint8_t *b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
void byte_swap16(void *a)
{
byte_swap(a, a + 1);
}
int main(void)
{
int16_t var1 = 0xABCD;
byte_swap16(&var1);
printf("a = %x\n", var1);
byte_swap16(&var1);
printf("a = %x\n", var1);
return 0;
}
運作結果:
資料排布其實我不是很熟悉,但是看上去似乎有那麼回事兒。
接下來實作32bit版本:
void byte_swap32(void *a)
{
byte_swap(a, a + 3);
byte_swap(a + 1, a + 2);
}
#include <stdio.h>
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef short int16_t;
void byte_swap(uint8_t *a, uint8_t *b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
void byte_swap16(void *a)
{
byte_swap(a, a + 1);
}
void byte_swap32(void *a)
{
byte_swap(a, a + 3);
byte_swap(a + 1, a + 2);
}
int main(void)
{
uint32_t var1 = 0xABCD1234;
byte_swap32(&var1);
printf("a = %x\n", var1);
byte_swap32(&var1);
printf("a = %x\n", var1);
return 0;
}