【问题标题】:how to produce a 48-bit number on a 32-bit system如何在 32 位系统上生成 48 位数字
【发布时间】:2018-04-28 16:30:05
【问题描述】:

任务是使用 32 位系统向网络发送代表自 UNIX 纪元以来毫秒数的 little-endian 字节。

数字 1510747673476 代表当前日期,即 2017 年 11 月 15 日。在 32 位系统中,系统无法想到这个数字。自 UNIX 时代以来,它也没有毫秒的来源。但它确实有秒数的来源。我们可以生成毫秒始终为零的 48 位数字。

说 y = 1510747673 是自当前日期的 UNIX 纪元以来的秒数。有没有办法改为格式化 1510747673 * 10^3 ?这意味着我会得到数字 1510747673 的字节,并以某种方式发现我需要另外两个字节来组成 1510747673 * 10^3 的小端字节?就是这个问题。

欢迎提出更好的问题。目标是以毫秒为单位传递当前日期的 6 个字节。接收端期望它是 little-endian 和 48 位大小。

【问题讨论】:

  • 你在说什么编程语言?
  • 我们正在谈论 Lua。是否相关?
  • "32-bit" 只是字长。这不是计算机的限制。
  • 通常是的——编程语言通常会抽象出处理大于硬件本机大小的类型的问题。我不熟悉 Lua,但我想它有一些方法可以处理“大”整数类型。
  • 我明白了。我有一个可以格式化 32 位整数的库。我发现我可以处理更大的数字。似乎这个 Lua 系统对整数使用双精度数据类型。例如,设置 y = 1510747673476 并将其打印出来得到 1.51075e+12。我不确定这只是打印还是真的丢失了数字的“673476”部分。但这条路线对我来说是完全未知的领域。所以我一直在使用我拥有的库来格式化最多 32 位的数字——它总是给我 4 个字节来处理它格式化的任何数字。

标签: 32bit-64bit unix-timestamp


【解决方案1】:

您有秒数 y,它适合 32 位数据类型。您想以 little-endian 格式格式化 y + 10^3。所以你需要两个代表 10^3 的小端字节。它们是 0xe8 和 0x03。

因此,使用格式化 32 位整数的库并获取代表 y 的 4 个字节。这些将是 48 位整数的 4 个最高有效字节。称它们为 b3、b4、b5、b6。所需的 little-endian 答案是 0xe8、0x03、b3、b4、b5、b6。

【讨论】:

  • 这根本不正确。我会尝试找到不同的方法,但这是完全错误的。如果可以,请完全删除此答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 2011-09-21
  • 2021-04-27
  • 1970-01-01
相关资源
最近更新 更多