将十六进制(或二进制)数据放入Java字符串

时间:2013-07-07 19:27:50

标签: java

在C中有一个转义序列,可以将十六进制(或二进制)值嵌入到字符串中?这样的事情。

String str = "12345" + "\x0B" + "Some additional text";

Java中是否有类似的功能?

4 个答案:

答案 0 :(得分:5)

目前尚不清楚你想要实现的目标。 Java中的String 只是一系列UTF-16代码单元(通常表示“一系列字符”,但{{3>以外的字符需要两个UTF-16代码单元)。如果你也需要二进制数据,则不应使用字符串。

现在你可以使用\u000b在字符串中包含Unicode字符U + 000B(行列表) - 但是你需要确保它实际上是你想要做的。

如果您实际尝试混合文本数据和二进制数据,我建议您不要这样做 - 它非常很容易丢失数据或转换它厉害。如果您提供实际要求,我们可能会帮助您提供更好的解决方案。

答案 1 :(得分:3)

在Java中,您可以使用Integer.toString(int i, int radix)

对于十六进制,这是

String str = "12345" + Integer.toString(0x0B, 16) + "Some additional text";

答案 2 :(得分:1)

在Java中,Strings是Unicode文本。它们无法嵌入任意二进制数据。如果需要,您可以嵌入Unicode U + 000B LINE TABULATION字符:

String str = "12345\u000BSome additional text";

答案 3 :(得分:0)

如前所述,Java 字符串是 Unicode,因此为 2 个字节,并在内部表示为 char[]

@Jon Skeet 是对的 saying “如果您还需要二进制数据,则不应使用字符串”(但 Jon Skeet 总是< /em> 对 ;)):您应该使用 byte[]

但是,如果您真的需要使用字符串来存储二进制数据(因为它有时超出您的控制范围),Charset 会将您的字符串编码为 {{3 }}。事实证明,byte[] 会将 char 映射到单个 byte

String str = "aéç";
System.out.println(Arrays.toString(str.getBytes(StandardCharsets.ISO_8859_1)));
System.out.println(Arrays.toString(str.getBytes(StandardCharsets.UTF_8)));
System.out.println(Arrays.toString(str.getBytes(StandardCharsets.UTF_16)));

给出:

[97, -23, -25]
[97, -61, -87, -61, -89]
[-2, -1, 0, 97, 0, -23, 0, -25]

所以你可以使用 ISO-8859-1 charset 来存储二进制数据:

String str = "12345_Some additional text"; // '_' for the replacement character
byte[] hack = str.getBytes(StandardCharsets.ISO_8859_1);
hack[5] = 0x0B; // Change it here
str = new String(hack, StandardCharsets.ISO_8859_1); // Put it back