天天看點

135_C語言中大小端轉換

         最近軟體設計用到了一個需要大小端轉換的問題,本來想搜尋下看看有沒有現成的庫檔案或者代碼,後來沒有找到合适的。至少,沒有找到我喜歡的吧!還是自己動手做個吧!

         其實,核心的功能可以做成位元組交換。是以,先實作一個位元組交換功能。

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:

135_C語言中大小端轉換

         增加一個有符号的測試:

#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;
}           

         運作結果:

135_C語言中大小端轉換

         資料排布其實我不是很熟悉,但是看上去似乎有那麼回事兒。

         接下來實作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;
}