C++:如何将 32 位数据转换为有符号整数
C++: How to convert 32bit data into Signed Integers
在我的个人C++库中,我通过处理单个字节来处理在不同字节序系统(小或大)上的工作。例如,我使用指向 uint16 数据开头的指针作为函数的参数,按如下方式计算一个 16 位无符号整数:
constexpr uint16_t decode16(const uint8_t* x) {
return uint16_t(x[1] + x[0] * 0x100);
}
实际上,此函数不适用于 16 位有符号整数的字节数据,因此0xFF被解码为 -257。有人可以教我如何为有效的有符号整数编写类似的函数吗?0xFF应该解码为 -1。
编辑:这是我的临时解决方案,它是小端系统的解决方法,但不能传输到大端系统。我正在寻找的是如何为两者编码。
int16_t decode16(const int8_t* x) {
int8_t temp8[2];
temp8[0] = x[1];
temp8[1] = x[0];
int16_t temp16 = *(uint16_t *)&temp8[0];
return temp16;
}
好的伙计们,这就是我最终做到的。希望它能帮助任何喜欢采取类似方法的人。基本上,一点一点:
int16_t decode16(const int8_t* x) {
std::bitset<8> firstbyte(x[0]);
if (firstbyte[7] == 0) { // if positive integer, than treat as normal
return int16_t(x[1] + x[0] * 0x100);
} else { // if negative integer, I assumed it's in Signed 2's Complement form (http://www.cs.umd.edu/~meesh/cmsc411/local-notes/numbers/node5.html)
std::bitset<8> secondbyte(x[1]);
std::bitset<16> tempset;
// first copy all the bytes into a 16bit long bitset
for (int i = 0; i < 16; i++) {
if (i < 8) {
tempset[i] = secondbyte[i];
} else {
tempset[i] = firstbyte[i-8];
}
}
tempset.flip(); // then flip all bits
// then add 1
for (int i = 0; i < 16; i++) {
if (tempset[i] == 0) {
tempset[i] = 1;
for (int j = (i-1); j>=0; j--) {
tempset[j] = 0;
}
break;
}
}
int16_t answer = 0;
for (int i = 0; i < 16; i++) {
int16_t multiplier = 1;
for (int j = 0; j<i; j++) {
multiplier = multiplier*2;
}
answer = answer + tempset[i]*multiplier;
}
return answer*(-1);
}
}
相关文章:
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 获取隐式转换溢出从无符号到已签名的警告
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 如何将 UTF-8 文本从文件转换为某个可以迭代的容器,并检查每个符号是否为C++字母数字?
- 将浮点数转换为无符号字符数组并打印出来
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 将无符号转换为复杂<int>原因符号转换警告
- 如何解决隐式转换丢失整数精度:'size_t'(又名"无符号长")到'int'警告?
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 将无符号字符 C++ 转换为 C#
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 需要在c++中转换符号到dec