Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取用于构造字符串的字节[]?_Java_String_Character Encoding_Bytearray - Fatal编程技术网

Java 如何获取用于构造字符串的字节[]?

Java 如何获取用于构造字符串的字节[]?,java,string,character-encoding,bytearray,Java,String,Character Encoding,Bytearray,我有一些二进制数据被编码为UTF-8字符串。如何从字符串中获取原始数据?二进制数据没有特殊的字符编码,所以我不确定什么样的转换能满足我的需要。考虑下面的最小例子: byte[] input = { -84 }; String s = new String(input, Charset.forName("UTF8")); System.out.println(Arrays.toString(s.getBytes())); // prints [63] System.out.println(Arr

我有一些二进制数据被编码为UTF-8字符串。如何从字符串中获取原始数据?二进制数据没有特殊的字符编码,所以我不确定什么样的转换能满足我的需要。考虑下面的最小例子:

byte[] input = { -84 };
String s = new String(input, Charset.forName("UTF8"));
System.out.println(Arrays.toString(s.getBytes())); // prints [63] 
System.out.println(Arrays.toString(s.getBytes("UTF8"))); // prints [-17, -65, -67]

我正在寻找一种方法,它能让我返回
[-84]

一般来说,你不能。并非所有字节序列都是有效的UTF-8。因此,(容错)
byte[]->char[]->byte[]
进程中的数据可能已损坏

不过,您可以使用编码,它是
bytechar


这不是一个罕见的问题。许多古老的协议,如HTTP,都是以
ISO_8859_1
char或C的
char
类型开始的。更新版本的规范会说它基于“八位字节”,也就是“字节”。如果API使用字符串表示它们,
ISO_8859_1
通常是更好的选择

一般来说,你不能。并非所有字节序列都是有效的UTF-8。因此,(容错)
byte[]->char[]->byte[]
进程中的数据可能已损坏

不过,您可以使用编码,它是
bytechar

这不是一个罕见的问题。许多古老的协议,如HTTP,都是以
ISO_8859_1
char或C的
char
类型开始的。更新版本的规范会说它基于“八位字节”,也就是“字节”。如果API使用字符串表示它们,
ISO_8859_1
通常是更好的选择

字节
-84
0xAC
)本身不是有效的UTF-8字节序列。(UTF-8仅在多字节字符序列中使用0到127范围之外的字节来编码外来字符。)因此,UTF-8解码器将输入字节替换为Unicode“替换字符”。(这可能在控制台中显示为一个简单的问号。)无法从该字符串恢复原始字节数组,因为其他无效字节序列也会解码为替换字符

您可以执行以下操作:

  • 将二进制数据解释为字节和字符之间具有1对1映射的字符编码。ISO-8859-1是最方便的选择,因为它是保证在任何Java实现中可用的六种基本编码之一,并且具有预定义的常量。任何旧的DOS代码页(例如)如果存在也可以使用

  • 将您自己的
    byte[]
    转换为
    char[]
    转换。精确映射是任意的,可以是任何您喜欢的,只要它是无损的。通过在每个Java
    char
    中填充两个字节,您可能会将内存中每个字符串的大小减半,因为该类型是16位宽的,但这可能不值得大惊小怪

  • ,例如。这种编码本身会使数据变长,但如果字符串得到额外编码,则可能会使数据变短

    例如,如果您试图将二进制数据作为参数传递,则对其进行Base64编码是有意义的。取一个长度为256的字节数组,其中包含每个可能字节值中的1个(它将作为任何统一随机、压缩或加密数据的模型)。如果在Base64中编码并去除填充并使用修改后的URL安全Base64字母表,它将占用342个字符,但在URL编码并作为URL查询参数传递时,它不会再增长或发生任何更改。然而,像ISO-8859-1字符串一样被“解码”的同一字节数组只需要256个字符,但在放入URL时会增加到634个字符,因为URL编码针对纯文本而不是二进制数据进行了优化

  • 首先避免将二进制数据作为字符串传递。尽可能直接使用字节数组。如果您的目的是获取字符串特性,例如不变性和
    indexOf
    对字节数据的搜索,那么最好为数组创建一个包装类
    • 字节
      -84
      0xAC
      )本身不是有效的UTF-8字节序列。(UTF-8仅在多字节字符序列中使用0到127范围之外的字节来编码外来字符。)因此,UTF-8解码器将输入字节替换为Unicode“替换字符”。(这可能在控制台中显示为一个简单的问号。)无法从该字符串恢复原始字节数组,因为其他无效字节序列也会解码为替换字符

      您可以执行以下操作:

      • 将二进制数据解释为字节和字符之间具有1对1映射的字符编码。ISO-8859-1是最方便的选择,因为它是保证在任何Java实现中可用的六种基本编码之一,并且具有预定义的常量。任何旧的DOS代码页(例如)如果存在也可以使用

      • 将您自己的
        byte[]
        转换为
        char[]
        转换。精确映射是任意的,可以是任何您喜欢的,只要它是无损的。通过在每个Java
        char
        中填充两个字节,您可能会将内存中每个字符串的大小减半,因为该类型是16位宽的,但这可能不值得大惊小怪

      • ,例如。这种编码本身会使数据变长,但如果字符串得到额外编码,则可能会使数据变短

        例如,如果您试图将二进制数据作为参数传递,则对其进行Base64编码是有意义的。取一个长度为256的字节数组,其中包含每个可能字节值中的1个(它将作为任何统一随机、压缩或加密数据的模型)。如果在Base64中编码,去掉填充并使用修改的URL安全Base64字母表,则需要342个字符,