是否可以从十六进制数组中初始化一个String,比如C风格?
unsigned char[] charArray = {0x41, 0x42, 0x43};
为什么不可能做这样的事情?
String charArray = new String((byte[]) {0x41, 0x42, 0x43});
答案 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)0x41
。 byte
值也是如此(使用一个或另一个,具体取决于您的数字是ASCII还是Unicode BMP值)。您也可以使用unicode转义符,例如String str = "\u0041\u0042";
。要获取ASCII(或其他编码)字符串的字节表示(相反的操作),请使用以下语法:String charArray = "abcd".getBytes("UTF-8");
。
另外,请注意字节和字符之间的区别。字符由Unicode标准明确定义,并且始终具有相同的含义。字节的含义取决于所使用的字符编码,因此您不能仅仅使用字节来创建字符串。如果使用String(byte[])
构造函数,则隐式使用平台的默认编码 - 在某些情况下这可能存在风险。另一方面,String(char[])
是安全的(但是如果通过将十六进制数转换为char
来生成char
值,则事实上是从ASCII手动转换。)