c - 从 unit8_t 缓冲区到结构的指针类型转换
问题描述
我正在尝试将uint8_t
缓冲区类型转换为structure
以下bit
字段。
#include<stdio.h>
#include<inttypes.h>
struct msg{
uint64_t field:56;
};
void main()
{
uint8_t buf[8]={0x7,0x6,0x5,0x4,0x3,0x2,0x1};
struct msg *m = buf;
printf("buf=%"PRIx64"\n",m->field);
}
但我得到的输出如下。
实际输出:
buf=1020304050607
预期输出:
buf=7060504030201
类型转换时我做错了什么吗?
解决方案
您可以使用联合来更便携,而不是指针双关语
#include <stdio.h>
#include <stdint.h>
typedef union
{
struct
{
uint64_t u56:56;
};
uint8_t u8[sizeof(uint64_t)];
}msg;
msg *pune(msg *message, uint8_t *data, size_t datalen, int endianes)
{
if(endianes)
{
for(size_t index = 0; index < datalen; index++)
{
message -> u8[index] = data[index];
}
}
else
{
for(size_t index = 0; index < datalen; index++)
{
message -> u8[index] = data[datalen - index - 1];
}
}
return message;
}
int main()
{
msg message;
uint8_t buf[8]={0x7,0x6,0x5,0x4,0x3,0x2,0x1};
printf("buf=%llx\n",pune(&message, buf, 7, 1) -> u56);
printf("buf=%llx\n",pune(&message, buf, 7, 0) -> u56);
return 0;
}
推荐阅读
- javascript - OpenAPI V3 json 对象到 Swagger HTML 对象的 Javascript 转换以通过 jQuery 更新 DIV
- javascript - 我如何在输入字段而不是跨度中获取价格?
- ckeditor5 - CKEditor 5 自定义构建工具栏未显示
- javascript - 使用 Javascript 将跨度更改为输入
- swiftui - 如何通过点击 ForEach 中的按钮导航到不同的屏幕/视图
- python - python根据循环中的其他2列计算新列值
- react-native - 按底部标签打开抽屉不起作用
- angular - 如何使用 Angular 9 在子组件中捕获父事件
- r - 使用列值的数值向量对数值矩阵进行子集
- java - EAGER FetchType 是否填充到其子级