c - 正在存储截断的值
问题描述
这是我的缓冲区,任何人都可以解释我如何在其中存储一个十六进制值,当我尝试打印时buffer[0]
,它打印的是 0 而不是 500。我试图用 11 位的 ID 填充缓冲区的一个元素,我知道 char 是 1 个字节,即 8 位,它不能存储值。我还有其他元素要填充到缓冲区中,它们是 char 类型。所以我不能将缓冲区的类型从 char 更改为 int。我该如何解决我的问题。
char *buffer;
buffer = (char *)malloc(10*(sizeof(frameRd))); //frameRd is of 16bytes
buffer[0] = frameRd->id;
for(int i =1;i<15;i++)
{
buffer[i] = frameRd->data;
}
for(int i =0,i<16;i++)
{
printf("%4X",buffer[i]);
}
当frame->id = 0x500;
我在控制台上打印这个值时,它打印buffer[0]
为 0 肯定是因为
解决方案
既然buffer
是char*
,buffer[0]
就是char
。因此,赋值
buffer[0] = frameRd->id;
意思是“截断frameRd->id
到char
,并将结果存储在 中buffer[0]
”,也就是你观察到的效果。此外,当您使用 打印buffer[0]
时%4X
,您会打印单独的值buffer[0]
,转换为int
。
如果要将一个int
或一个整体struct
放入char[]
缓冲区,请使用memcpy
:
// Do not cast results of malloc
buffer = malloc(10*(sizeof(frameRd)));
// Save id into the buffer at index 0
memcpy(&buffer[0], &frameRd->id, sizeof(frameRd->id));
// Pull id back
int tmpId;
memcpy(&tmpId, &buffer[0], sizeof(tmpId));
printf("%04x\n", tmpId);
推荐阅读
- excel - 如果 + Search + MID 适用于一个字符串但不适用于另一个
- python-3.x - 如何在 python 3 中解析这样的字符串以使用 `\\x` 转换字符串中已经存在的十六进制字符
- r - 根据年份列(枢轴)创建虚拟变量
- javascript - 如何从由小时、分钟、日期、月份和年份组成的字符串创建日期对象?
- laravel - Laravel - 没有唯一约束匹配引用表的给定键 - 使用多个唯一性
- javascript - 如何防止 aws-sdk 将存储桶设置为 IP 地址的子域作为端点
- node.js - 找不到 Node.js 原生插件模块 (tfjs_binding.node)
- sql - SQL join 只匹配第一次出现
- c++ - 在 CUDA 中释放部分数组
- flutter - 如何使用 Flutter Getx 换屏