int16_t uint_16t float转换为uint_8t
很简单的内容,还是要打牢下基础,记录吸取教训
int16 to uint16
本质是有符号数与无符号数之间的转换,涉及到原码 补码 反码的知识。
无符号整数转换为有符号整数 :
看无符号数的最高位是否为1,如果不为1(为0),则有符号数就直接等于无符号数;如果无符号数的最高位为1,则将无符号数取补码,得到的数就是有符号数。
有符号整数转换为无符号整数:
看有符号数的最高位是否为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) { uint8_t farray[2]; 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) { uint8_t farray[2]; uint16_t temp = *intdata; 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) { 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数组的相互转换 - 知乎