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