最有效的类型转换或将long或int转换为4个char字符串

时间:2016-06-14 16:42:36

标签: java string integer long-integer

我的目标是节省数据存储空间,只接受字符串。

因为Java中的String是一个16位数组,所以我认为理论上我应该能够将我的8字节长转换为4字符串,因为它们都由8个字节表示。 (为了清楚起见,我对在基数10中使用人类可读的长整数不感兴趣,我希望将它尽可能地存储在字符串中。)

然而,我在此发现的几乎所有文献都是关于转换为8位字节类型,而不是char类型。

我可以编码为UTF8。我担心这意味着我将String的长度加倍,因为每个8位字节都存储为16位字符。这首先打破了我将数据压缩成64位介质的全部目的。

private static final Charset UTF8_CHARSET = Charset.forName("UTF-8");
new String(ByteBuffer.allocate(8).putLong(value).array(), UTF8_CHARSET);

我的担忧是否正确,我会浪费空间,如果是这样,有没有办法不浪费空间?

1 个答案:

答案 0 :(得分:2)

char != int

  

问:是否有任何UTF未生成的字节序列?怎么样   我应该解读一下吗?

     

答:没有UTF可以生成每个任意字节序列。 For   例如,在UTF-8中,必须遵循110xxxxx2格式的每个字节   使用10xxxxxx2格式的字节。序列如< 110xxxxx2   0xxxxxxx2>是非法的,绝不能生成。面对时   这个非法字节序列在转换或解释时是UTF-8   符合过程必须将第一个字节110xxxxx2视为非法   终止错误:例如,发出错误信号,过滤   字节输出,或用FFFD等标记表示字节   (替换字符)。在后两种情况下,它将继续下去   处理第二个字节0xxxxxxx2。

     

符合要求的过程不得解释非法或格式错误的字节   但是,序列作为字符可能需要进行错误恢复操作。   没有一致的过程可能使用不规则的字节序列来编码   带外信息。

String != byte[] && char != int

内部String个对象为Unicode,无论其来源是什么,都会编码为UTF-16

  

如何在Java平台中表示文本?

     

Java编程语言基于Unicode字符集,   并且有几个库实现了Unicode标准。原始人   Java编程语言中的数据类型char是无符号的16位   整数,表示U + 0000到的范围内的Unicode代码点   U + FFFF,或UTF-16的代码单位。各种类型和类别   表示字符序列的Java平台 - char [],   java.lang.CharSequence的实现(例如String类),   和java.text.CharacterIterator的实现 - 是UTF-16   序列。

String在内部由UTF-16

表示

UTF-8等字符编码仅适用于解释转换byte[]之间的关联。

即使您编写自定义CharsetProvider,所有操作都会对byte[] 外部进行编码/解码,这绝对会更改事实上是String is internally represented by UTF-16,所以你想做的事情是毫无意义的。

无法完成

Character is actually a 32 bit number, the Charset is just an encoding of that 32 bit number. UTF-8 can be 1, 2, 3 or 4 bytes for example, and UTF-16 is 2,4 bytes with a bit specifying if the next byte(s) is part of the same character or not.