在Java中获取文本字节大小的最佳方法是什么?

问题描述 投票:0回答:1

我已经用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中)。例如 a 一般取一个字节,Unicode 例如需要两个字节。

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

我想要一些这个喜欢在这个网站上使用的技术。http:/bytesizematters.com

它给我 26 bytes 对于本文 QÂʫP†ǒ!‡˜q‡Úy¦\dƒὥ죉ὥ 虽然文本的长度是22。

java javafx byte java-11
1个回答
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 是两个字节。

String的替代品。

  • byte[] 自己: Arrays 提供实用功能,如 arrayEquals.
  • ByteArrayInputStream, ByteArrayOutputStream
  • ByteBuffer 可以包 byte[]可读写短int...
  • 转换 byte[]基数64 字符串使用 Base64.getEncoder().encode(bytes).

将一个字节转换为一些字符

其目的是将一个字节转换为GUI文本字段中可显示的可见符号,且其长度(以chars为单位)与原始字节数相同。

例如,字体 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;
    }
}

A char 是Unicode的UTF-16编码,但这里也对应一个Unicode码点(int)。

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

© www.soinside.com 2019 - 2024. All rights reserved.