2011-06-16 88 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.通常,这涉及将每个字段强制为一定数量的字节,然后将这些值复制到那些字节中,然后通过网络传输它们,将它们写入文件等。

相关问题