以下總結兩種方式實現數據的反轉,包含 InvertUint8 InvertUint16 InvertUint32
源碼地址爲 :https://download.csdn.net/download/wzy15965343032/11946002
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "crc_about.h"
//#define ulong char
int main()
{
unsigned char data1[2] = { 0x12, 0x21 };
unsigned char data2[2];
printf(" hello - gowinsemi \r\n");
InvertUint8(data2,data1);
printf("InvertUint8 \r\n %02x %02x -> %02x %02x \r\n ", data1[0], data1[1], data2[0], data2[1]);
printf("ReverseBits \r\n %02x -> %02x \r\n ", data1[0], ReverseBits(data1[0]));
printf("ReverseBits_n\r\n %02x -> %02x \r\n ", data1[0], ReverseBits_n(data1[0], 8));
getchar();
return 1;
}
//第一種寫法
void InvertUint8(unsigned char *dBuf, unsigned char *srcBuf)
{
int i;
unsigned char tmp[4];
tmp[0] = 0;
for (i = 0; i< 8; i++)
{
if (srcBuf[0] & (1 << i))
tmp[0] |= 1 << (7 - i);
}
dBuf[0] = tmp[0];
}
void InvertUint16(unsigned short *dBuf, unsigned short *srcBuf)
{
int i;
unsigned short tmp[4];
tmp[0] = 0;
for (i = 0; i< 16; i++)
{
if (srcBuf[0] & (1 << i))
tmp[0] |= 1 << (15 - i);
}
dBuf[0] = tmp[0];
}
void InvertUint32(unsigned int *dBuf, unsigned int *srcBuf)
{
int i;
unsigned int tmp[4];
tmp[0] = 0;
for (i = 0; i< 32; i++)
{
if (srcBuf[0] & (1 << i))
tmp[0] |= 1 << (15 - i);
}
dBuf[0] = tmp[0];
}
//第二種寫法
static char ReverseBits(char b)
{
char newValue = 0;
for (int i = 7; i >= 0; i--)
{
newValue |= (char)((b & 1) << i);
b >>= 1;
}
return newValue;
}
ulong ReverseBits_n(ulong ul, int valueLength)
{
ulong newValue = 0;
for (int i = valueLength - 1; i >= 0; i--)
{
newValue |= (ul & 1) << i;
ul >>= 1;
}
return newValue;
}
crc_about.h 如下
#define ulong char
void InvertUint8(unsigned char *dBuf, unsigned char *srcBuf);
void InvertUint16(unsigned short *dBuf, unsigned short *srcBuf);
void InvertUint32(unsigned int *dBuf, unsigned int *srcBuf);
char ReverseBits(char b);
ulong ReverseBits_n(ulong ul, int valueLength);
結果: