如果以前有人问过这个问题,请原谅我,但我向你保证,我已经在互联网上搜索过,但一无所获,可能是因为我没有正确的术语。
我想取一个整数并将其转换为小端(?)十六进制表示,如下所示:
303 -> 0x2f010000
我可以看到字节被打包,使得 16 和 1 的位置都在同一个字节中,并且 4096 的位置和 256 的位置共享一个字节。如果有人能给我指出这种编码的正确术语,我相信我能找到关于如何做到这一点的答案。谢谢!
将位移运算符与按位 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)));
}
Big-endian 和 little-endian 指的是内存中字节的顺序。像 0x2f100000 这样的值没有内在的字节序,字节序取决于 CPU 架构。
如果您总是想反转 32 位值中字节的顺序,请使用 Demi 发布的代码。
如果您总是想获得特定的字节顺序(因为您正准备通过网络传输这些字节,或者将它们存储到磁盘文件中),请使用其他东西。例如,BSD 套接字库有一个函数 htonl(),它获取 CPU 的本机 32 位值并将其放入大端顺序。
如果您在 little-endian 机器上运行,htonl(303) == 0x2f100000。如果您在大端机器上运行,htonl(303) == 303。在这两种情况下,结果都将由内存中的字节 [0x00, 0x00, 0x01, 0x2f] 表示。
如果有人可以对我试图做的事情给出一个具体的术语,我仍然很想听听。然而,我确实找到了一种方法来做我需要的事情,我会把它贴在这里,所以如果有人来照顾我,他们可以找到它。可能有(可能是)一种更简单、更直接的方法来做到这一点,但这是我最终在 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。