2011-12-01 164 views
3

我找到了一个将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 
+1

我不知道剩下的..但确实>>但是通过许多位的移位。所以b >> 4除以2^4(或16)。 – varatis

回答

4

首先,让我们先从一些定义:

  • 一个char,在Java中,占据2个字节;
  • 每个byte8比特组成;
  • 每个十六进制数字表示二进制数字或比特;

因此,byte可以通过2进制位数来表示,即两个组,每组4位。这正是在byteToHex方法中所做的:它首先将字节分成两组,每组4位,然后使用hexDigit数组将每个字节映射到十六进制符号。由于每个4位组的十进制值不能大于或等于16(2^4),因此每个组将始终在hexDigits阵列中有映射。

例如,假设你要的数量29转换为十六进制:

  1. 29以二进制为00011101表示;
  2. 劈裂00011101两组4位产生00011101;
  3. 以编程方式,第一组0001可以通过从29的二进制表示中移开最低有效4位(1101)来获得。然后,0001将成为第一个4位。这是用Java完成的(b >> 4);
  4. 第二组,由b & 0x0f,这相当于00011101 & 00001111 = 00001101 = 1101获得。通过比特AND荷兰国际集团的二进制数与0x0f你清除(设置为0)以外的所有至少显著4位。
  5. 最后,每个组被转换成十进制数,得到10001)和131101),然后将其映射到1D分别在十六进制。因此
  6. 29由十六进制1D表示。

类似的逻辑可应用于方法charToHex。唯一的区别是不是转换单个字节,而是转换2,因为char是2个字节。

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位。

+0

我认为“字节”只是0&1,你怎么可以转移12345678? – hungneox

+0

请注意,我使用1-8作为位置标记。实际数据全部为0和1。 – Thomas

+0

你知道它为什么有两个部分,我猜他们是高和低? @Thomas – hungneox

相关问题