我找到了一个将byte或char转换为十六进制值的java类。但我无法清楚地理解代码。你能解释代码的作用或我可以在哪里找到更多关于此的资源吗?
public class UnicodeFormatter {
static public String byteToHex(byte b) {
// Returns hex String representation of byte b
char hexDigit[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
char[] array = {hexDigit[(b >> 4) & 0x0f], hexDigit[b & 0x0f]};
return new String(array);
}
static public String charToHex(char c) {
// Returns hex String representation of char c
byte hi = (byte) (c >>> 8);
byte lo = (byte) (c & 0xff);
return byteToHex(hi) + byteToHex(lo);
}
} // class
答案 0 :(得分:4)
首先,让我们从一些定义开始:
char
占用 2个字节; byte
由 8位组成; 因此, byte
可以用 2个十六进制数字表示,即两组4位。这正是在byteToHex
方法中所做的事情:它首先将字节分成两组,每组4位,然后使用hexDigit
数组将每个字节映射为十六进制符号。由于每组4位的十进制值永远不能大于或等于16(2^4
),因此每个组将始终在hexDigits
数组中具有映射。
例如,假设您要将数字29
转换为十六进制:
29
以二进制形式表示为00011101
; 00011101
拆分成两组4位,得出0001
和1101
; 0001
可以通过从1101
的二进制表示中移走最低有效4位(29
)来获得。然后,0001
将成为第一个4
位。这是在Java中使用(b >> 4
); b & 0x0f
获得的,相当于00011101 & 00001111 = 00001101 = 1101
。通过位AND
将二进制数与0x0f
进行清除(设置为0)除了最低有效4位之外的所有内容。1
(0001
)和13
(1101
),然后映射到{{1} }和1
分别在十六进制系统中。D
因此以十六进制的29
表示。类似的逻辑可以应用于方法1D
。唯一的区别是不是转换单个字节,而是转换2,因为charToHex
是2个字节。
答案 1 :(得分:2)
基本上它在这里做的就像把23变成一个字符串一样,把它改成2 * 10 + 3,然后把2和3变成字符。
为了打破它,我们首先除以16,因为我们正在使用十六进制。
b>> 4意味着将位移4位,所以
12345678 >> 4 = 00001234
然后在hexDigit数组中查找位置1234中的值。
然后我们进行模数运算,也称为得到余数。在十进制示例中,这是通过砍掉左边的所有内容来找到3。对于二进制,他们在这里使用AND。
0x0f(位)为00001111,因此当与一个字节进行AND运算时,它会将左侧4个空格更改为0,只留下右侧4个。
12345678 & 0x0f = 00005678
然后我们再次查找hexDigit数组中位置5678的值。请注意,我使用1-8作为位置标记,实际数据将全部为0和1。
编辑:第二个功能基本上做同样的操作,它使用相同的>>>和&用于将unicode char拆分为字节的函数。它似乎假设unicode字符是16位,所以它将它移位8位以获得左8位,并使用& 0xff得到正确的8位。