我已经用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ƒὥ죉ὥ
上层方法返回的是 length
或 length * 2
但我想计算实际的字节数(不是在JVM中)。例如 a
一般取一个字节,Unicode ™
例如需要两个字节。
那么如何在Java中实现这种技术呢?
我想要一些这个喜欢在这个网站上使用的技术。http:/bytesizematters.com
它给我 26 bytes
对于本文 QÂʫP†ǒ!‡˜q‡Úy¦\dƒὥ죉ὥ
虽然文本的长度是22。
请注意。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之间。