2011-06-16 178 views
2
  1. C++中是否有可移植的無符號long?
  2. 有沒有辦法使一個便攜式結構?

在我的機器上,unsigned long是8個字節。在工作機器上它的4個字節。 當您在家中開始寫入工作的應用程序時,存在通過網絡傳輸的數據的正確性問題。C/C++中的portable unsigned long

謝謝。

回答

8

#include <stdint.h>以下類型定義:

  • (u)int8_t
  • (u)int16_t
  • (u)int32_t
  • (u)int64_t

雖然去年5月份或可能不可用,具體取決於平臺。

+0

根據平臺的不同,它們全部可能也可能不可用。它們僅適用於C99實現或作爲額外(不可靠)功能。 – pmg 2011-06-16 21:24:20

+0

@Xeo:這對網絡透明度沒有幫助。 – Omnifarious 2011-06-16 21:25:22

+0

在一個相當現代的gcc的linux中,你可以毫無問題地使用該頭文件。在VC不包括作爲默認,但有頭可用,請參閱http://stackoverflow.com/questions/126279/c99-stdint-h-header-and-ms-visual-studio – 2011-06-16 21:28:05

0

大多數平臺都有可以使用的稱爲uint32_t,uint64_t等的typedef。據我所知這些不是標準的,但我用過的每個平臺都有它們。

+3

它們通過[C99 ](http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1256.pdf)。 – pmg 2011-06-16 21:25:33

5

然後不要這樣做。使用類似protocol buffers的東西在網絡上傳輸東西。將結構轉儲爲文件描述符只是一個壞主意,你不應該這樣做。

如果您有符合C99標準的C實現,可以使用<stdint.h>以確保您使用的類型足夠大以容納您要發送的數據。但即使這樣還不夠,因爲您的工作機器和家用機器可能有不同的永久性或任何其他問題。 <stdint.h>非常適合確保您的變量足夠大以保存所需的全部值,但它們不是確保您可以通過網絡傳輸數據而不會遇到任何問題的工具。

+2

你也可以使用'htonl' /'ntohl' /'htons' /'ntohs'(POSIX函數)在'uint32_t'值和表示之間來回轉換,以通過網絡傳遞。 – 2011-06-16 21:45:11

2

正如其他人所說,使用標準的數據大小將工作(例如,從stdint.h)

可以使結構更便攜通過結合使用這些數據類型有一些技術用來製造數據結構更輕便,例如data structure alignment.通常,這涉及將每個字段強制爲一定數量的字節,然後將這些值複製到那些字節中,然後通過網絡傳輸它們,將它們寫入文件等。

相關問題