以二进制形式将多个整数分配给字符数组

时间:2010-01-29 22:40:06

标签: c++

我有三个整数(每个整数有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/

然而它被提到:“目标中的终止空字符被源的第一个字符覆盖”,我显然不想要,因为大多数时候整数在结尾都会有一个空字符,除非值是真的很大。有人知道更好的工作方法吗?任何帮助表示赞赏。

4 个答案:

答案 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;