Java从十六进制数组初始化字符串

时间:2012-03-08 20:42:47

标签: java string hex

是否可以从十六进制数组中初始化一个String,比如C风格?

unsigned char[] charArray = {0x41, 0x42, 0x43};

为什么不可能做这样的事情?

String charArray = new String((byte[]) {0x41, 0x42, 0x43});

3 个答案:

答案 0 :(得分:3)

完全有可能,你可以通过多种方式实现。

  • 使用unicode转义:

    String string = "\u0041\u0042\u0043";
    
  • 创建和使用字节数组:

    String string = new String(new byte[] {(byte) 0x41, (byte) 0x42, (byte) 0x43});
    

你要记住的主要事情是字符串不是某个数组,它是一个单独的对象。因此,它应该创建为字符串文字,或者与其中一个构造函数一起创建。

答案 1 :(得分:2)

问题不在于String,而在于Java数组,特别是字节。

你可以做到

String charArray = new String(new byte[] {(byte) 0x41, (byte) 0x42,
  (byte) 0x43});

或者更好的是,您可以使用ASCII转义等来更简单地编写字符串。

"\u0041\u0042\u0043"

答案 2 :(得分:1)

Java中没有未签名的类型,因此您的数组必须包含常规char值。但是,默认情况下,数字文字的类型为int,因此您可能需要将值转换为char,如下所示:(char)0x41byte值也是如此(使用一个或另一个,具体取决于您的数字是ASCII还是Unicode BMP值)。您也可以使用unicode转义符,例如String str = "\u0041\u0042";。要获取ASCII(或其他编码)字符串的字节表示(相反的操作),请使用以下语法:String charArray = "abcd".getBytes("UTF-8");

另外,请注意字节和字符之间的区别。字符由Unicode标准明确定义,并且始终具有相同的含义。字节的含义取决于所使用的字符编码,因此您不能仅仅使用字节来创建字符串。如果使用String(byte[])构造函数,则隐式使用平台的默认编码 - 在某些情况下这可能存在风险。另一方面,String(char[])是安全的(但是如果通过将十六进制数转换为char来生成char值,则事实上是从ASCII手动转换。)