什么是获取Java中文本大小的最佳方法(以字节为单位)

时间:2019-02-25 10:06:56

标签: java javafx byte java-11

注意:我已尽力了解您的问题。但是抱歉,我的英语有些差。耐心一点!如果有任何混乱的评论我。非常感谢

我已经用Java实现了加密算法。现在,我想以字节为单位测量加密前后的消息大小。

如何获取以字节为单位的文本大小??

例如,如果我有一个简单的文本Hi! I am alphanumeric (8÷4=2)

我已经尽力了,但是没有找到最好的解决方案。

String temp = "Hi! I am alphanumeric (8÷4=2)"
temp.length() // this works because in ASCII every char takes one byte

// and in java every char in String takes two bytes so multiply by 2
temp.length() * 2

// also String.getBytes().length and getBytes("UTF-8").length
// returns same result

但是在我的情况下,消息解密后,字符变成了ASCII和Unicode的混合体。

例如QÂʫPǒ!qÚy¦\dὥì£ὥ

上部方法返回lengthlength * 2

但是我想计算实际字节(不是在JVM中)。例如,char a通常占用一个字节,而Unicode 例如占用两个字节。

那么如何在Java中实现这种技术。

我想要一些类似本网站http://bytesizematters.com/中使用的技术

它给我26 bytes的文本QÂʫPǒ!qÚy¦\dὥì£ὥ,尽管文本的长度为22。

注意:我一般希望字节不取决于JVM的存储方式

1 个答案:

答案 0 :(得分:2)

请注意:String用于Unicode文本(能够混合所有类型的脚本),char是两个字节的UTF-16。

这意味着二进制数据byte[]需要知道其编码/字符集,并将转换为String。

byte[] b = ...
String s = ...
b = s.getBytes(StandardCharsets.UTF_8);
s = new String(b, StandardCharsets.UTF_8);

不使用字节的显式字符集,则采用平台默认值,它将提供不可移植的代码。

UTF-8将允许所有文本,不仅包括某些脚本,还允许希腊文,阿拉伯文和日文。

尽管涉及转换,但非文本二进制数据可能会损坏,不是合法的UTF-8,将花费两倍的内存,并且由于转换而变慢。

因此不惜一切代价避免使用String作为二进制数据。

回答您的问题:

  • 您可能会被StandardCharsets.ISO_8859_1所吸引-这是一种单字节编码。
  • String.getBytes(StandardCharsets.ISO_8859_1).length()将对应于String.length(),尽管String可能使用两倍的内存,因为char是两个字节。

字符串的替代项:

  • byte[]本身,Arrays提供了实用功能,例如arrayEquals
  • ByteArrayInputStream, ByteArrayOutputStream
  • ByteBuffer可以包装byte[];可以读写short / int /...
  • 使用byte[]Base64.getEncoder().encode(bytes)转换为 Base64 字符串。

将字节转换为某些字符

目标是将字节转换为可显示在GUI文本字段中的可见符号,并且其中以char表示的长度与原始字节数相同。

例如,字体 Lucida Sans Unicode 的U + 2400符号代表ASCII控制字符。对于第8位的字节,可以使用西里尔字母,尽管由于西里尔字母е和拉丁语e的相似性可能会引起混淆。

static char byte2char(byte b) {
    if (b < 0) { // -128 .. -1
        return (char)(0x400 - b);
    } else if (b < 32) {
        return (char)(0x2400 + b);
    } else if (b == 127) {
        return '\u25C1';
    } else {
        return (char) b;
    }
}

char是Unicode的UTF-16编码,但在这里也对应于Unicode代码点(int)。

一个字节是有符号的,因此范围从-128到127。