我有三个整数(每个整数有4个字节的内存),我想将每个二进制值分配给一个包含12个元素的字符数组。所以,如果每个整数的值都是2,那么我希望字符数组具有以下值:
2 0 0 0 2 0 0 0 2 0 0 0
我试过了:
memcpy(cTemp, &integer1 + &integer2 + &integer3, 12);
但是我收到“无效的操作数”编译器错误。
我还发现了这里引用的函数strcat:http://www.cplusplus.com/reference/clibrary/cstring/
然而它被提到:“目标中的终止空字符被源的第一个字符覆盖”,我显然不想要,因为大多数时候整数在结尾都会有一个空字符,除非值是真的很大。有人知道更好的工作方法吗?任何帮助表示赞赏。
答案 0 :(得分:1)
如果要查看变量如何表示为字节序列,可以执行以下操作。
int i[3] = {2, 2, 2};
char cTemp[sizeof i];
memcpy(cTemp, &i, sizeof i);
但请注意,不同平台上的表示形式会有所不同。你想解决什么?
修改强>
我只是编写一个程序来编辑[一个文件],该文件恰好以二进制形式存储整数。
你为什么不首先这样说?如果你知道程序只能在int
具有正确内存布局的平台上运行,你可以简单地存储整数。
fout.write((char const *)&i, sizeof i);
但是,如果您想要便携,则需要正确序列化它。
void store_uint32_le(char * dest, unsigned long value)
{
for (int i = 0; i < 4; ++i)
{
*dest++ = value & 0xff;
value >>= 8;
}
assert(value == 0);
}
int main()
{
char serialized[12];
store_uint32_le(serialized, 2);
store_uint32_le(serialized + 4, 2);
store_uint32_le(serialized + 8, 2);
std::ofstream fout("myfile.bin", std::ios::binary);
fout.write(serialized, sizeof serialized);
}
答案 1 :(得分:1)
可能更简单(如果你在x86上至少:P)只是转换指针并直接分配。即。
int* p = (int*) cTemp;
p[0] = a;
p[1] = b;
p[2] = c;
答案 2 :(得分:1)
你也可以做一个工会黑客:
union translate {
char c[sizeof(int) * 3];
int i[3];
};
translate t;
t.i[0] = 2;
t.i[1] = 2;
t.i[2] = 2;
// access t.c[x] to get the chars
...并阅读字符......
答案 3 :(得分:0)
我认为这应该有效:
int i,j,k;
char a[12];
*((int*)a) = i;
*(((int*)a)+1) = j;
*(((int*)a)+2) = k;