我想在我的应用程序中支持一些串行设备。这个设备是与另一个程序一起使用的,我想与这个设备和这个程序创建的保存文件进行交互。
一些未被发现的原因,奇怪的整数铸造。设备通过串行USB连接返回uint8,程序将它们保存为int8到文件中,当您读取文件时,您需要将2个int8合并为单个uint16。
因此,在读取设备后写入保存文件时,我需要将int8转换为uint8,从而导致任何高于127的值被写入为负值。
然后当我读取保存文件时,我需要将2个int8组合成一个uint16。(因此,将负值转换为正值,然后将它们粘贴在一起)
然后当我从应用程序中保存到保存文件时,我需要将uint16拆分为2个int8。
我需要想出函数"encode"one_answers"combine"one_answers"explode">
// When I read the device and write to the save file:
uint8_t val_1 = 255;
int8_t val_2 = encode(val_1);
REQUIRE(-1 == val_2);
// When I read from the save file to use it in my program.
int8_t val_1 = 7;
int8_t val_2 = -125;
uint16_t val_3 = combine(val_1, val_2);
REQUIRE(1923 == val_3);
// When I export data from my program to the device save-file
int8_t val_4;
int8_t val_5;
explode(val_3, &val_1, &val_2);
REQUIRE(7 == val_4);
REQUIRE(-125 == val_5);
谁能让我先走一步?您的encode方法可以只是一个赋值。无符号整数类型和有符号整数类型之间的隐式转换有很好的定义。
uint8_t val_1 = 255;
int8_t val_2 = val_1;
REQUIRE(-1 == val_2);
对于combine -你需要将你的第一个值转换为uint16_t
,以确保你有足够的可用位,然后将其左移8位。这将导致第一个值中的位组成新值的8个最高位(8个最低位为零)。你可以添加你的第二个值,设置8最低有效位。
uint16_t combine(uint8_t a, uint8_t b) {
return ((uint16_t)a << 8) + b;
}
explosion将与此相反。你需要右移8位来获得第一个输出值,然后简单地赋值来获得最低的8位。
void explode(uint16_t from, int8_t &to1, int8_t &to2) {
// This gets the lowest 8 bits, and implicitly converts
// from unsigned to signed
to2 = from;
// Move the 8 most significant bits to be the 8 least
// significant bits, and then just assign as we did
// for the other value
to1 = (from >> 8);
}
作为完整程序:
#include <iostream>
#include <cstdint>
using namespace std;
int8_t encode(uint8_t from) {
// implicit conversion from unsigned to signed
return from;
}
uint16_t combine(uint8_t a, uint8_t b) {
return ((uint16_t)a << 8) + b;
}
void explode( uint16_t from, int8_t &to1, int8_t &to2 ) {
to2 = from;
to1 = (from >> 8);
}
int main() {
uint8_t val_1 = 255;
int8_t val_2 = encode(val_1);
assert(-1 == val_2);
// When I read from the save file to use it in my program.
val_1 = 7;
val_2 = -125;
uint16_t val_3 = combine(val_1, val_2);
assert(1923 == val_3);
// When I export data from my program to the device save-file
int8_t val_4;
int8_t val_5;
explode(val_3, val_4, val_5);
assert(7 == val_4);
assert(-125 == val_5);
}
有关位操作机制的进一步阅读,您可以查看此处。