在我写的一个开源程序中,我正在读取文件中的二进制数据(由另一个程序编写)并输出整数,双精度和其他各种数据类型.其中一个挑战是它需要在两个端点的32位和64位机器上运行,这意味着我最终不得不做一些低级别的bit-twiddling.我知道(非常)关于类型惩罚和严格别名的一点点,并且想要确保我正确地做事.
基本上,很容易从char*转换为各种大小的int:
int64_t snativeint64_t(const char *buf)
{
/* Interpret the first 8 bytes of buf as a 64-bit int */
return *(int64_t *) buf;
}
Run Code Online (Sandbox Code Playgroud)
我有一组支持函数来根据需要交换字节顺序,例如:
int64_t swappedint64_t(const int64_t wrongend)
{
/* Change the endianness of a 64-bit integer */
return (((wrongend & 0xff00000000000000LL) >> 56) |
((wrongend & 0x00ff000000000000LL) >> 40) |
((wrongend & 0x0000ff0000000000LL) >> 24) |
((wrongend & 0x000000ff00000000LL) >> 8) |
((wrongend & 0x00000000ff000000LL) << 8) |
((wrongend & 0x0000000000ff0000LL) << 24) |
((wrongend …Run Code Online (Sandbox Code Playgroud) 我一直在努力寻找一种可移植的方法来序列化C和C++中的32位浮点变量,以便发送到微控制器和从微控制器发送.我希望格式足够明确,以便可以从其他语言完成序列化/反序列化,而无需太多努力.相关问题是:
我知道在大多数情况下,类型转换联合/ memcpy可以正常工作,因为浮动表示是相同的,但我宁愿有更多的控制和心灵.到目前为止我想出的是以下内容:
void serialize_float32(uint8_t* buffer, float number, int32_t *index) {
int e = 0;
float sig = frexpf(number, &e);
float sig_abs = fabsf(sig);
uint32_t sig_i = 0;
if (sig_abs >= 0.5) {
sig_i = (uint32_t)((sig_abs - 0.5f) * 2.0f * 8388608.0f);
e += 126;
}
uint32_t res = ((e & 0xFF) << 23) | (sig_i & 0x7FFFFF);
if (sig < 0) {
res |= 1 << 31;
}
buffer[(*index)++] = (res …Run Code Online (Sandbox Code Playgroud) 程序应该如何从C语言或Vala语言中读取和写入二进制文件中的浮点数?
用于写入和读取的通用API通常设计为以字节格式写入.我的意思是你必须将一个字节数据的数组写入文件并以相同的格式读取.
我正在寻找一种以浮动格式编写和读取的方法.没有类型转换,无需将数字更改为字符串.可能吗?
有人可以帮助我在C++中序列化这个简单的类:
class State {
public:
int count;
Point point;
double angle;
Point* possible;
int possibleSize;
Line line;
list<Point> route;
State() {
}
~State() {
delete[] possible;
}
};
// --- Structures
// Line structure (ax + by + c = 0)
struct Line {
int a;
int b;
int c;
};
// Point structure
struct Point {
int x;
int y;
};
Run Code Online (Sandbox Code Playgroud)
我不能使用任何第三方类或库,我需要将其序列化为字节数组(或字符串).有人可以写怎么样?我只是不知道如何开始.
非常感谢.