位移并将字符转换为Unicode转义字符串
问题描述:
我找到了一个将byte或char转换为十六进制值的java类。但我无法清楚地理解代码。你能解释一下代码的功能吗?或者我可以在哪里找到更多的资源?位移并将字符转换为Unicode转义字符串
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
答
首先,让我们先从一些定义:
- 一个
char
,在Java中,占据2个字节; - 每个
byte
由8比特组成; - 每个十六进制数字表示二进制数字或比特;
因此,byte
可以通过2进制位数来表示,即两个组,每组4位。这正是在byteToHex
方法中所做的:它首先将字节分成两组,每组4位,然后使用hexDigit
数组将每个字节映射到十六进制符号。由于每个4位组的十进制值不能大于或等于16(2^4
),因此每个组将始终在hexDigits
阵列中有映射。
例如,假设你要的数量29
转换为十六进制:
-
29
以二进制为00011101
表示; - 劈裂
00011101
两组4位产生0001
和1101
; - 以编程方式,第一组
0001
可以通过从29
的二进制表示中移开最低有效4位(1101
)来获得。然后,0001
将成为第一个4
位。这是用Java完成的(b >> 4
); - 第二组,由
b & 0x0f
,这相当于00011101 & 00001111 = 00001101 = 1101
获得。通过比特AND
荷兰国际集团的二进制数与0x0f
你清除(设置为0)以外的所有至少显著4位。 - 最后,每个组被转换成十进制数,得到
1
(0001
)和13
(1101
),然后将其映射到1
和D
分别在十六进制。因此 - 数
29
由十六进制1D
表示。
类似的逻辑可应用于方法charToHex
。唯一的区别是不是转换单个字节,而是转换2,因为char
是2个字节。
答
基本上它是做什么这里是相同的,改成2 * 10 + 3,然后转向图2和3成字符转动23成一个字符串。
要分解它,我们首先除以16,因为我们使用十六进制。
B >> 4装置移位的位4位,所以
12345678 >> 4 = 000
然后在位置中的值1234得到hexDigit阵列中查找。
然后我们做一个模数运算,也就是所谓的求余数。在十进制例子中,这是通过切断左边的所有内容来找到3。对于二进制,他们在这里使用AND。在位
为0x0F是00001111,因此当用一个字节相与,它会改变左4位为0,只留下4
12345678 & 0x0f = 00005678
我们再次查找在位置5678的权值在hexDigit数组中。请注意,我使用1-8作为位置标记,实际数据将全部为0和1。
编辑:第二个函数的功能基本相同,它使用相同的>>>和&函数将unicode字符分成字节。它似乎假定unicode字符是16位,所以它将其移位8位以获得左8位,并使用0xff来获得正确的8位。
我不知道剩下的..但确实>>但是通过许多位的移位。所以b >> 4除以2^4(或16)。 – varatis