最近我一直在浏览一些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的赋值是什么。
如果我需要发布完整的示例代码,我会问,因为我不确定是否需要它。
答案 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
。
现在要获取此字节的十六进制表示,您只需要将13
和10
转换为十六进制表示并连接。为此,您只需在特定索引处的准备好的13
字符串中查找字符。 HEX_CHARS
- &gt; 10
,A
- &gt; 13
生成D
- &gt; 218
。