int16_t uint_16t float转换为uint_8t

很简单的内容,还是要打牢下基础,记录吸取教训

int16 to uint16

本质是有符号数与无符号数之间的转换,涉及到原码 补码 反码的知识。

  1. 无符号整数转换为有符号整数 :

    看无符号数的最高位是否为1,如果不为1(为0),则有符号数就直接等于无符号数;如果无符号数的最高位为1,则将无符号数取补码,得到的数就是有符号数。

  2. 有符号整数转换为无符号整数:

    看有符号数的最高位是否为1,如果不为1(为0),则无符号数就直接等于有符号数;如果有符号数的最高位为1,则将有符号数取补码,得到的数就是无符号数。

总结:有符号数与无符号数之间的转换,都要看要转换的数的最高位是否为1,如果不为1,则转换结果就是要转换的数的本身;如果为1,则转换结果就是转换的数(看作是负数)的补码。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void int162u8Arry(uint8_t *u8Arry, int16_t *intdata, bool key) //big small
{
uint8_t farray[2];
//方法一
// uint16_t temp = *intdata;
//方法二
uint16_t temp ;
if (*intdata >= 0)
{
temp = *intdata;
}
else
{
temp = 65535+*intdata +1;
}
farray[0] = temp & 0xFF;
farray[1] = (temp >> 8) & 0xFF;
if (key)
{
u8Arry[0] = farray[1];
u8Arry[1] = farray[0];
}
else
{
u8Arry[0] = farray[0];
u8Arry[1] = farray[1];
}
}

uint16 to uint8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void uint162u8Arry(uint8_t *u8Arry, uint16_t *intdata, bool key) //big small
{
uint8_t farray[2];
uint16_t temp = *intdata;
//convert uint16_t to uint8_t, using little endian
farray[0] = temp & 0xFF;
farray[1] = (temp >> 8) & 0xFF;
if (key)
{
u8Arry[0] = farray[1];
u8Arry[1] = farray[0];
}
else
{
u8Arry[0] = farray[0];
u8Arry[1] = farray[1];
}
}

float to uint8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void float2u8Arry(uint8_t *u8Arry, float *floatdata, bool key) //big small
{
uint8_t farray[4];
*(float *)farray = *floatdata;
if (key == true)
{
u8Arry[3] = farray[0];
u8Arry[2] = farray[1];
u8Arry[1] = farray[2];
u8Arry[0] = farray[3];
}
else
{
u8Arry[0] = farray[0];
u8Arry[1] = farray[1];
u8Arry[2] = farray[2];
u8Arry[3] = farray[3];
}
}

unit8 to float

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
float u8Arry2float(uint8_t *data, bool key)
{
float fa = 0;
uint8_t uc[4];
if (key == true)
{
uc[3] = data[0];
uc[2] = data[1];
uc[1] = data[2];
uc[0] = data[3];
}
else
{
uc[0] = data[0];
uc[1] = data[1];
uc[2] = data[2];
uc[3] = data[3];
}

memcpy(&fa, uc, 4);
return fa;
}

获取uint8每一位数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>

int main(){
uint8_t a = 2;
std::cout << "a0 = " << ((a>> (0 % 8)) & 1) << std::endl;
std::cout << "a1 = " << ((a>> (1 % 8)) & 1 )<< std::endl;
std::cout << "a2 = " << ((a>> (2 % 8)) & 1 )<< std::endl;
std::cout << "a3 = " << ((a>> (3 % 8)) & 1 )<< std::endl;
std::cout << "a4 = " << ((a>> (4 % 8)) & 1 )<< std::endl;
std::cout << "a5 = " << ((a>> (5 % 8)) & 1 )<< std::endl;
std::cout << "a6 = " << ((a>> (6 % 8)) & 1 )<< std::endl;
std::cout << "a7 = " << ((a>> (7 % 8)) & 1 )<< std::endl;

int b = ((a>> (1 % 8)) & 1 ) * 2 + ((a>> (0 % 8)) & 1 );
std::cout << "a0a1 = " << b << std::endl;
return 0;
}

参考链接

c - Extracting bits from uint8_t type array - Stack Overflow

原码/反码/补码计算器 - 一个工具箱 - 好用的在线工具都在这里!

十六进制转十进制| 16进制转10进制 | 在线进制转换

字节序探析:大端与小端的比较 - 阮一峰的网络日志

float类型与uint8数组的相互转换 - 知乎