【问题标题】:Encoding of ... some sort?编码……某种?
【发布时间】:2009-05-20 19:00:13
【问题描述】:

如果以前有人问过这个问题,请原谅我,但我向你保证,我已经搜索了互联网,但没有找到任何结果,可能是因为我没有正确的术语。

我想取一个整数并将其转换为 little-endian(?) 十六进制表示,如下所示:

303 -> 0x2f010000

我可以看到字节被打包,使得 16 和 1 的位置都在同一个字节中,并且 4096 的位置和 256 的位置共享一个字节。如果有人可以为我指出这种编码的正确术语,我相信我可以找到关于如何做到这一点的答案。谢谢!

【问题讨论】:

  • 您在寻找像 dec2hex 这样的函数吗?许多语言都有将十进制转换为十六进制表示的功能。
  • +1 可能是我在 SO 上见过的最礼貌的问题。 :-)
  • 直接转换为十六进制不是问题——如示例中,我可以通过十六进制转换将 303 转换为 12f。如果有意义的话,我需要的是使用一个字节进行编码来保存每对十六进制“位置”。

标签: encoding hex


【解决方案1】:

将位移运算符与按位 AND 和 OR 运算符结合使用...

假设 32 位无符号:

int value = 303;
int result = 0x00000000;

for (int i = 0; i < 4; i++)
{
    result = result | ((value & (0xFF << (i * 8))) << (24 - (i * 8)));
}

【讨论】:

  • 谢谢,黛米。我认为这最终不是我所需要的,但可能更多,因为我没有完全描述这个问题。
  • @Blumer:vb 中的代码 sn-p 基本上做同样的事情,只是运算顺序略有不同,并且使用整数除法而不是位运算。您本质上是将字节 0 与字节 3 进行字节交换,将字节 1 与字节 2 交换
【解决方案2】:

Big-endian 和 little-endian 指的是内存中字节的顺序。像 0x2f100000 这样的值没有内在的字节序,字节序取决于 CPU 架构。

如果您总是想颠倒 32 位值中字节的顺序,请使用 Demi 发布的代码。

如果您总是想获得特定的字节顺序(因为您正准备通过网络传输这些字节,或者将它们存储到磁盘文件中),请使用其他方式。例如。 BSD 套接字库有一个函数 htonl(),它获取 CPU 的本机 32 位值并将其放入大端顺序。

如果您在 little-endian 机器上运行,htonl(303) == 0x2f100000。如果您在大端机器上运行,则 htonl(303) == 303。在这两种情况下,结果都将由内存中的字节 [0x00, 0x00, 0x01, 0x2f] 表示。

【讨论】:

    【解决方案3】:

    如果有人可以给我想要做的事情一个具体的术语,我仍然很想听听。然而,我确实找到了一种方法来做我需要的事情,我会把它贴在这里,所以如果有人来照顾我,他们可以找到它。可能有(可能是)一种更简单、更直接的方法,但这是我最终在 VB.Net 中所做的,以取回我想要的字节码:

    Private Function Encode(ByVal original As Integer) as Byte()    
        Dim twofiftysixes As Integer = CInt(Math.Floor(original / 256))
        Dim sixteens As Integer = CInt(Math.Floor((original - (256 * twofiftysixes)) / 16))
        Dim ones As Integer = original Mod 16
        Dim bytecode As Byte() = {CByte((16 * sixteens) + ones), CByte(twofiftysixes), 0, 0}
        Return bytecode
    End Function
    

    有效地将整数分解为其十六进制分量,然后将适当的对转换为 cBytes。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 2020-11-02
      • 2010-11-15
      相关资源
      最近更新 更多