2010-05-16 43 views
2

我想要做的就是附加一个二进制整数转换成字符串对象。到目前为止,我有这样的:类型转换的跨平台兼容性

int number = 5; 
cppstring.append((char*)&number, 4); 

它正常工作与Windows在x86系统上,但有些人说的不是跨平台和不安全。什么是这样做的首选方法?

回答

3

它不可移植的原因是整数并不总是4个字节。例如,ILP64数据模型使用8字节整数。 C99只需要ints至少2个字节。为什么你需要这样做,如果int的大小不是4字节,那么期望的行为是什么?

+0

字符串对象的内容将被存储在数据文件和包含整数通过程序来读取。 – kaykun 2010-05-16 05:42:18

+1

然后,您可能需要为文件格式定义固定大小的整数,并在整个程序中使用适当的类型(例如int32_t)。 – 2010-05-16 05:44:11

1

它将 总是 平时的工作,你是什么平台上,如果你的工作只是意味着“不出事”。 编辑我错过了string::appendsize参数,所以它可能实际上崩溃或产生奇怪的结果,因为在平台上缓冲区下溢,其中ints不是4字节长。

但是,您可能会发现基于该平台的整数大小和endianness您的代码运行时,如果你想分享一个平台到另一个平台上运行同一程序上创建的文件是不同的结果。

这取决于你希望它做什么。 Windows(通常)在具有32位整数的机器上运行,这意味着您的代码将在您的字符串中附加05 00 00 00。但是,在big-endian也有32位整数的机器上,您的代码会将00 00 00 05附加到该字符串。更糟糕的是,您的代码可能会在具有16位big-endian整数的平台上运行,这将会追加00 05

根据你想要的行为,这可能是实现“少神奇”的方式追加字节,就像一个for循环,知道它要追加4个字节的little-endian的时尚是个好主意:

int number = 5; 
for(int i = 0; i < 4; i++) 
{ 
    char numberByte = (number >> (8 * i)) & 0xFF; 
    cppstring.append(&numberByte, 1); 
} 

这样一来,你是因为代码依赖于整数无论是尺寸还是字节顺序确定的结果将是跨平台的一致性。

+0

它很可能会崩溃,因为int类型允许为16位。 – 2010-05-16 05:47:23