我有以下内容:
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/