首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否在char数组中存储int?

是否在char数组中存储int?
EN

Stack Overflow用户
提问于 2009-10-05 23:57:27
回答 8查看 69.4K关注 0票数 23

我想将一个4字节的int存储在char数组中...使得char数组的前4个位置是int的4个字节。

然后,我想将int从数组中拉回...

另外,如果有人能给我在循环中做这件事的代码,就会得到加分……例如,将8个整数写入32字节数组。

int har = 0x01010101;
char a[4];
int har2;

// write har into char such that:
// a[0] == 0x01, a[1] == 0x01, a[2] == 0x01, a[3] == 0x01 etc.....

// then, pull the bytes out of the array such that:
// har2 == har

谢谢你们!

编辑:假设int是4个字节...

EDIT2:请不要关心字节顺序...我会担心字节顺序的问题。我只想用不同的方式在C/C++中实现上面的功能。谢谢

EDIT3:如果你不知道,我正试着在底层写一个序列化类……因此,我正在寻找不同的策略来序列化一些常见的数据类型。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-10-06 00:33:33

这不是最理想的方法,但是endian是安全的。

int har = 0x01010101;
char a[4];
a[0] = har & 0xff;
a[1] = (har>>8)  & 0xff;
a[2] = (har>>16) & 0xff;
a[3] = (har>>24) & 0xff;
票数 23
EN

Stack Overflow用户

发布于 2009-10-06 00:01:32

除非你关心字节顺序之类的,否则memcpy将会完成这个任务:

memcpy(a, &har, sizeof(har));
...
memcpy(&har2, a, sizeof(har2));

当然,不能保证在任何特定的实现上都会有sizeof(int)==4 (而且在实际的实现中,这实际上是假的)。

从这里开始,编写一个循环应该是微不足道的。

票数 42
EN

Stack Overflow用户

发布于 2009-10-06 00:14:39

注意:通过不是最后一个赋值的元素访问联合是未定义的行为。(假设平台中的字符为8位,整数为4字节)位掩码0xFF将屏蔽一个字符,因此

char arr[4];
int a = 5;

arr[3] = a & 0xff;
arr[2] = (a & 0xff00) >>8;
arr[1] = (a & 0xff0000) >>16;
arr[0] = (a & 0xff000000)>>24;

会使arr持有最高有效字节,而arr3持有最低有效字节。

编辑:只是为了让你理解这个技巧&是位明智的'and‘,其中as &&是逻辑'and’。感谢关于被遗忘的移位的评论。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1522994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档