某种类型的编码?

5

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

我想把一个整数转换成小端(?)十六进制表示,就像这样:

303 -> 0x2f010000

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


你是否正在寻找类似于dec2hex的函数?许多编程语言都有将十进制转换为十六进制表示的功能。 - Kekoa
3
这是我在SO上看过的可能最有礼貌的问题,点赞!:-) - Paul Sonier
直接转换为十六进制不是问题——就像示例中一样,我可以使用十六进制转换将303转换为12f。我需要的是使用一个字节来保存每对十六进制“位”的编码,如果这有意义的话。 - Blumer
3个回答

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)));
}

谢谢,Demi。我觉得这可能不完全是我所需的,但很可能更多是因为我没有完全描述清楚问题。 - Blumer
@Blumer:你的VB代码片段本质上做的是相同的事情,只是操作顺序稍有不同,并且使用整数除法而不是位运算。你实际上是在交换字节0和字节3,以及字节1和字节2。 - Demi

2
大端和小端是指内存中字节的顺序。像0x2f100000这样的值没有固有的字节序,字节序取决于CPU架构。
如果您总是想反转32位值的字节顺序,请使用Demi发布的代码。
如果您总是想获得特定的字节序(因为您正在准备将这些字节传输到网络上,或将它们存储到磁盘文件中),请使用其他方法。例如,BSD套接字库有一个函数htonl(),它获取您CPU的本地32位值并将其放入大端序。
如果您在运行小端机器上,htonl(303) == 0x2f100000。如果您在运行大端机器上,htonl(303) == 303。在两种情况下,结果都将由内存中的字节[0x00、0x00、0x01、0x2f]表示。

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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接