注意:我已尽力了解您的问题。但是抱歉,我的英语有些差。耐心一点!如果有任何混乱的评论我。非常感谢
我已经用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中)。例如,char a
通常占用一个字节,而Unicode ™
例如占用两个字节。
那么如何在Java中实现这种技术。
我想要一些类似本网站http://bytesizematters.com/中使用的技术
它给我26 bytes
的文本QÂʫPǒ!qÚy¦\dὥì£ὥ
,尽管文本的长度为22。
注意:我一般希望字节不取决于JVM的存储方式
答案 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。