Pol*_*878 20 c c++ arrays pointers
我想在char数组中存储一个4字节的int ...这样char数组的前4个位置就是int的4个字节.
然后,我想把int拉出数组......
此外,如果有人可以给我代码在循环中执行此操作,奖励积分... IE写入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
Run Code Online (Sandbox Code Playgroud)
多谢你们!
编辑:假设int有4个字节......
编辑2:请不要关心字节序...我会担心字节序.我只是想用不同的方法来实现C/C++中的上述功能.谢谢
编辑3:如果你不能说,我正在尝试在低级写一个序列化类......所以我正在寻找不同的策略来序列化一些常见的数据类型.
Pav*_*aev 39
除非你关心字节顺序等等,memcpy否则会做到这一点:
memcpy(a, &har, sizeof(har));
...
memcpy(&har2, a, sizeof(har2));
Run Code Online (Sandbox Code Playgroud)
当然,并不能保证sizeof(int)==4在任何特定的实现上(并且有实际的实现,这实际上是错误的).
从这里写一个循环应该是微不足道的.
小智 22
不是最优化的方式,但是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;
Run Code Online (Sandbox Code Playgroud)
int main() {
typedef union foo {
int x;
char a[4];
} foo;
foo p;
p.x = 0x01010101;
printf("%x ", p.a[0]);
printf("%x ", p.a[1]);
printf("%x ", p.a[2]);
printf("%x ", p.a[3]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请记住,a [0]在一个小端机器上保存LSB而a [3]保持MSB.
#include <stdio.h>
int main(void) {
char a[sizeof(int)];
*((int *) a) = 0x01010101;
printf("%d\n", *((int *) a));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
记住:
指向对象或不完整类型的指针可以转换为指向不同对象或不完整类型的指针.如果生成的指针未针对指向类型正确对齐,则行为未定义.
注意:通过不是最后一个元素的元素访问联合是未定义的行为.(假设字符为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;
Run Code Online (Sandbox Code Playgroud)
会使arr [0]保持最重要的字节,而arr [3]保持最少.
编辑:只是让你理解这个技巧并且有点明智'和'其中&&是逻辑'和'.感谢有关遗忘转变的评论.
不要使用工会,帕维尔澄清:
这是UB,因为C++禁止访问除写入的最后一个之外的任何工会成员.特别是,编译器可以
int使用上面的代码自由地完全取消对成员的赋值,因为它的值随后不被使用(它只看到char[4]成员的后续读取,并且没有义务在那里提供任何有意义的值) .在实践中,g ++尤其以提取这些技巧而闻名,所以这不仅仅是理论.另一方面,使用static_cast<void*>后跟static_cast<char*>保证可以工作.
- 帕维尔·米娜耶夫