将字符串转换为HexString时,低和高半字节的目的是什么

时间:2018-05-04 20:32:18

标签: java md5 nibble

最近我一直在浏览一些MD5的例子,开始了解安全性,MD5在大多数情况下都很容易理解,并且即使它不再安全,也是一个很好的起点。尽管如此,在将字符串转换为十六进制字符串时,我还有一个关于高和低半字节的问题。

所以我知道高半字节和低半字节等于半个字节,或者也可以是表示单个十六进制数字的十六进制数字。我不理解的是他们的工作方式和服务目的。我一直在谷歌搜索,我找不到很多答案,这将有助于解释他们在他们所处的环境中所做的事情。以下是转换的背景:

private static String toHexString( byte[] byteArray )
    {
        final String HEX_CHARS = "0123456789ABCDEF"; 

        byte[] result = new byte[byteArray.length << 1];
        int len = byteArray.length;
        for( int i = 0 ; i < len ; i++ )
        {
            byte b = byteArray[i]
            int lo4 = b & 0x0F;
            int hi4 = ( b & 0xF0 ) >> 4;


            result[i * 2] = (byte)HEX_CHARS.charAt( hi4 );
            result[i * 2 + 1] = (byte)HEX_CHARS.charAt( lo4 );
        }
        return new String( result );
    } 

我并不完全理解for语句中发生了什么。我很感激任何帮助理解这一点,如果有一些链接到一些地方,我可以了解更多关于此,请也离开它。

我理解半字节的基本定义,但不理解操作以及对数字4的赋值是什么。

如果我需要发布完整的示例代码,我会问,因为我不确定是否需要它。

2 个答案:

答案 0 :(得分:1)

这只是一点点操作。 &amp; character取每个的文字位值并对它们进行逻辑运算。

int lo4 = b & 0x0F;

例如,如果b = 24,那么它将评估为

 00011000
+00001111
=00001000

第二个这样的行在前四位上执行相同的操作。

 00011000
+11110000
=00010000

&#39;&gt;&gt;&#39;将所有位在该方向上移位一定数量

00010000 >> 4 = 00000001. 

这样做是为了从数字中导出十六进制值。由于十六进制中的每个字符可以通过将数字拆分为4位来表示4位,因此我们可以将其转换。

在b = 24的情况下,我们没有lo4 = 1000或8和hi4 = 0001或1.循环的最后一部分为每个部分分配字符值。

Hex_chars [hi4] =&#39; 1&#39;和Hex_chars [lo4] =&#39; 8&#39;这给了你&#34; 18&#34;对于该字符串的十六进制24的部分。

答案 1 :(得分:1)

此代码只是将字节数组转换为十六进制表示形式。在misses - 循环内,每个字节都转换为两个字符。我认为在一个例子中更容易理解它。

假设数组中的一个字节是for(无符号)。这是218二进制文件。

通过使用位掩码1101 1010对字节进行AND运算,

lo4得到最低的4位:

00001111

这会产生十进制的int lo4 = b & 0x0F; 1010

10通过与位掩码hi4进行AND运算并向右移位4位获得最高的4位:

1111 0000

这会产生十进制的int hi4 = ( b & 0xF0 ) >> 4; 1101

现在要获取此字节的十六进制表示,您只需要将1310转换为十六进制表示并连接。为此,您只需在特定索引处的准备好的13字符串中查找字符。 HEX_CHARS - &gt; 10A - &gt; 13生成D - &gt; 218