2010-05-16 39 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