当前位置: 首页 > 面试题库 >

为什么新的String(bytes,enc).getBytes(enc)不返回原始字节数组?

劳昊明
2023-03-14
问题内容

我进行了以下“模拟”:

byte[] b = new byte[256];

for (int i = 0; i < 256; i ++) {
    b[i] = (byte) (i - 128);
}
byte[] transformed = new String(b, "cp1251").getBytes("cp1251");

for (int i = 0; i < b.length; i ++) {
    if (b[i] != transformed[i]) {
        System.out.println("Wrong : " + i);
    }
}

对于cp1251此输出,仅错误的一个字节-在位置25。
对于KOI8-R-一切正常。
对于cp1252-4或5个差异。

这是什么原因,如何克服?

我知道以任何编码形式将字节数组表示为字符串是 错误的 ,但这是付款提供商协议的要求,因此我别无选择。

更新:ISO-8859-1作品中表示出来,我将在byte[]部分和cp1251文本部分使用它,因此问题仅出于好奇


问题答案:

目标集中不支持某些“字节”-它们被替换为?字符。当您转换回去时,?通常会转换为字节值63-这不是以前的值。



 类似资料:
  • 问题内容: 我可以看到它们与我创建字符串所用的字节不同!我已经使用“ AES / CBC / PKCS5Padding”来获取字符串。 问题答案: 当您按原样对字符串进行解码时,是因为您将字节编码为UTF-8或兼容格式。您不能只取一个随机字节并将其转换为字符串,因为它是二进制数据而不是文本。 您可以做的是对二进制文件使用Base64编码器,并使用Base64解码器将其转换回原始字节。 这样做的一种

  • 问题内容: 为什么大多数其他数据类型都没有Java的String基本类型? 问题答案: 字符串是一个对象,根本不是原始类型,只是一个字符数组。James Gosling的访谈 摘录摘述了Java中根本存在原始类型的原因,这很有趣。 Bill Venners: Java为什么会有原始类型?为什么不是所有事物都只是一个对象? James Gosling: 完全是效率问题。有各种各样的人已经建立了以in

  • 问题内容: 是否可以将字符串转换为字节数组,然后在Java或Android中将其转换回原始字符串? 我的目标是将一些字符串发送到微控制器(Arduino)并将其存储到EEPROM(仅1 KB)中。我尝试使用MD5哈希,但它似乎只是一种单向加密。我该怎么办? 问题答案: 我建议使用字符串的成员,但 使用显式编码 : 通过使用一种显式编码(以及一种支持所有Unicode的编码),您可以避免仅调用等问题

  • 问题内容: 只是出于好奇。 数字似乎不太合逻辑。顺便说一句,就像或返回假。这是javascript的特性之一,还是有原因呢? 编辑:谢谢你的回答。但是,要让所有人适应现实并非易事。阅读答案和Wiki我了解得更多,但仍然有类似 与NaN的比较始终会返回无序结果,即使与自身进行比较也是如此。比较谓词是信令或非信令,信令版本表示此类比较的无效异常。相等和不相等谓词是无信号的,因此x = x返回false

  • 我需要实现具有暂停/恢复功能的音频录制,输出必须是m4a文件格式。所以我实现了PCM格式的录音。然后我使用(仅适用于旧的Android版本)我在这里找到的库-https://github.com/timsu/android-aac-enc 奇怪的是它适用于很多设备(比如我的nexus 7),但不适用于Samsung Star。没有崩溃,之后的玩家试图播放它,但只有一种非常奇怪的噪音。 我怀疑这与处

  • 使用sizeof()打印变量的大小 为什么sizeof()返回int的大小,而不是短int,即2个字节?