gpt4 book ai didi

Java byte[] 到 String 和 UTF-8

转载 作者:行者123 更新时间:2023-11-29 06:06:34 25 4
gpt4 key购买 nike

我正在实现 Cipher Block Chaining对于学校作业,问题要求采用 String 并返回另一个 String 的方法。起初,我认为这很奇怪,byte[] 变量会更合适,但仍然实现了一个方法。基本上,这是代码:

static public String encode(String message) {
byte[] dataMessage = message.getBytes();
ByteArrayOutputStream out = new ByteArrayOutputStream();

byte last = (byte) (Math.random() * 256);
byte cur;
out.write(last);

for (byte b : data) {
cur = (byte) (b^last);
System.out.println("Encode '" + (char) b + "' = " + b + "^" + last + " > " + cur );
out.write( cur );
last = cur;
}

System.out.println("**ENCODED BYTES = " + Arrays.toString(out.toByteArray()));
System.out.println("**ENCODED STR = " + Arrays.toString(out.toString().getBytes()));

return out.toString();
}

decode 方法的工作原理类似。有时,该方法会吐出类似的结果

Encode 'H' = 72^109 > 37
Encode 'e' = 101^37 > 64
Encode 'l' = 108^64 > 44
Encode 'l' = 108^44 > 64
Encode 'o' = 111^64 > 47
**ENCODED BYTES = [109, 37, 64, 44, 64, 47]
**ENCODED STR = [109, 37, 64, 44, 64, 47]

但有时也会吐出类似的东西

Encode 'H' = 72^-63 > -119
Encode 'e' = 101^-119 > -20
Encode 'l' = 108^-20 > -128
Encode 'l' = 108^-128 > -20
Encode 'o' = 111^-20 > -125
**ENCODED BYTES = [-63, -119, -20, -128, -20, -125]
**ENCODED STR = [-17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67]

我认为这与 UTF-8(系统的默认编码)有关,但我还不够熟悉,无法弄清楚确切为什么这样的字符串会与给定的一起返回字节。

最佳答案

您不能采用任意字节序列并假设它是有效的 UTF-8 编码字符串。所以,我怀疑 toString 方法,如 documented , 用平台默认字符集的默认替换字符串替换格式错误的输入和不可映射的字符序列

因此,您不应像这样将纯二进制数据转换为字符串。使用 Hex 或 Base64 等编码将您的字节转换为可打印的字符串,反之亦然。

Apache commons-codec 有一个 Base64 实用类。

关于Java byte[] 到 String 和 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8363681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com