位移并将字符转换为unicode转义字符串

时间:2011-12-01 16:27:14

标签: java hex bit

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

2 个答案:

答案 0 :(得分:4)

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

  • Java中的 char 占用 2个字节;
  • 每个 byte 8位组成;
  • 每个十六进制数字代表 4 二进制数字或;

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

例如,假设您要将数字29转换为十六进制:

  1. 29以二进制形式表示为00011101;
  2. 00011101拆分成两组4位,得出00011101;
  3. 以编程方式,第一组0001可以通过从1101的二进制表示中移走最低有效4位(29)来获得。然后,0001将成为第一个4位。这是在Java中使用(b >> 4);
  4. 完成的
  5. 第二组是b & 0x0f获得的,相当于00011101 & 00001111 = 00001101 = 1101。通过位AND将二进制数与0x0f进行清除(设置为0)除了最低有效4位之外的所有内容。
  6. 最后,每个组都转换为十进制数,产生10001)和131101),然后映射到{{1} }和1分别在十六进制系统中。
  7. 数字D因此以十六进制的29表示。
  8. 类似的逻辑可以应用于方法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位。