c - 如何正确组合 4 个字节来制作 float (单个)

标签 c buffer

我有以下内容:

payload.data[i].data = (buf[8] << 24) | (buf[9] << 16) | (buf[10] << 8) | (buf[11]);

注意:payload.data[i].data如果是 float 类型。

使用这个:printf("test:%X%X%X%X", buf[8], buf[9], buf[10], buf[11]);,我已确认缓冲区包含 #42C78A3D 或 DEC 99.77(大致)。

这:printf("Float value:%f", payload.data[i].data 打印出 1120373248.00,这是 #42C78A00 的 DEC

在我看来,由于某种原因,buf[11] 变空了。

这是我的代码的更完整 View :

    int i = 0;
    int j = 0;

    struct sensor_payload payload;

    payload.key = (buf[0] << 8) | buf[1];
    payload.id = (buf[2] << 8) | buf[3];
    payload.type = (buf[4] << 8) | buf[5];
    payload.fields = buf[6];

    for(i = 0, j = 0; i < payload.fields; i++, j = j +33){
        payload.data[i].data_type = buf[j+7];
        payload.data[i].data = (buf[j+8] << 24) | (buf[j+9] << 16) | (buf[j+10] << 8) | (buf[j+11]);
        slog(0, SLOG_DEBUG, "test:%X%X%X%X", buf[8], buf[9], buf[10], buf[11]);
    }

    payload.valid = true;


    return payload;

和定义:

struct sensor_data{
    uint8_t data_type;
    float data;
};

struct sensor_payload{
    uint16_t key, id, type;
    uint8_t fields;
    struct sensor_data data[4];
    bool valid;

};

最佳答案

您的代码中有很多不清楚的地方。但是,我看到的唯一差异是您将索引偏移条目放入 data(注意 j+x 模式):

(buf[j+8] << 24) | (buf[j+9] << 16) | (buf[j+10] << 8) | (buf[j+11])

在打印非胶印整本时:

slog(0, SLOG_DEBUG, "test:%X%X%X%X", buf[8], buf[9], buf[10], buf[11])

从技术上讲,您正在打印和放入 float 的数据仅对于 i==0 是相同的。

关于c - 如何正确组合 4 个字节来制作 float (单个),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33588813/

相关文章:

java - 打开缓冲对象流时出现 EOFException

在 C 中创建 HTTP 客户端以下载网页以供离线查看

c - 为什么最右边的数字不是零(C/Linux)?

c - Win32 - 在创建窗口之前拦截窗口的更好方法

Java StringBuffer、ASCII 字符和串行通信

sockets - 当内部缓冲区填满时 TCP 会发生什么

c - atoi 函数从缓冲区添加数字

c - 如何检测堆栈粉碎错误的违规代码

java - 使用 Java/c# 中与 C 中不同的后缀增量向自身添加变量

c - 如何在 Xeon Phi 中传递结构以卸载