【问题标题】:Is it a bad practice to use uint64_t in this context?在这种情况下使用 uint64_t 是一种不好的做法吗?
【发布时间】:2017-03-31 22:29:29
【问题描述】:

我最近一直在玩 C 套接字,我设法在客户端和服务器之间交换文件。但是我偶然发现了这个问题:在我的 mac(64 位)和树莓派(32 位)之间发送文件大小时,它失败了,因为 size_t 在两者之间是不同的。我通过切换到uint64_t解决了。

  • 我想知道,用它代替size_t 是不是一种不好的做法,size_t 是在 fread()、fwrite()、read()、write()、stat.size 的所有原型中定义的?
  • uint64_t 在树莓派上会变慢吗?

【问题讨论】:

  • 我会说不,因为intxx_t 类型保证在任何地方都是相同的大小,而intlongsize_t 等则不是。
  • 你也可以发送一个字符串而忘记这些问题。
  • 根据您希望它的便携性,您还必须考虑字节序。在所有形式的数据通信中,您发送的数据的大小和格式都应由通信协议指定
  • @Lundin 所以我应该在发送时使用 htonl() 并在接收后使用 ntohl() ,对吧?
  • 如果您环顾四周,有很多 htonl()ntohl() 的 64 位实现可用。

标签: c sockets types cross-platform


【解决方案1】:

这不仅是一种良好的做法,而且最终也是必要的。如果不定义数据的格式和大小,并想出可移植的方式来解释它,就无法在不同架构的不同计算机之间交换数据。这些固定宽度的类型实际上就是为此目的而设计的。

在 32 位平台上使用 uint64_t 会比 uint32_t 慢吗?可能是。明显吗?对此感到怀疑。但是你可以测量它并找出答案。

别忘了account for differences in endianness

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多