将字节数组转换为字符串时的格式更改

Posted

技术标签:

【中文标题】将字节数组转换为字符串时的格式更改【英文标题】:Change of format when converting byte array to String 【发布时间】:2011-09-17 07:25:55 【问题描述】:

参考这篇帖子Why are the lengths different when converting a byte array to a String and then back to a byte array?

我了解这样做会更改包含二进制数据的字节数组

 String s = new String(bytes);

可能会导致二进制数据的格式发生变化,因为它使用默认编码创建了一个字符串,该字符串可能会将某些二进制字符转换为未知字符,例如“?”如果你把它转换回字节数组,那就错了。

目前我在 ByteArrayInputStream 中有一个 mime,因为 mime in mime 看起来像这样

--boundary
//content type, id, etc...
//empty line
//Binary Data
--boundary--

如果我首先无法将字节数组转换为字符串,如何从 Inputstream 中提取二进制数据并将其转换为 Base64?我正在考虑使用边界来拆分从 Bytearrayinputstream 转换的 Sting,但这样做会在我想将其编码为 Base64 之前弄乱二进制数据。

【问题讨论】:

【参考方案1】:

如果您在二进制数据中提供正确的字符串编码,您可以安全地将二进制转换为字符串!如果你知道你的二进制文件在 ISO8859-1 中包含一个字符串,那么就这样做

new String(byteArray,"ISO8859-1") 

什么都不会丢失。并且供您参考:Base64 编码字符串仅包含 ASCII 字符,这些字符在 UTF-8 以及所有典型的 Windows 和 ISO 编码中都是相同的,因此您不会对它们有任何问题。

【讨论】:

其中涉及一些巫术 - 消息中有二进制数据。内容未经过 Base64 编码。 这就是乐趣的开始。客户端不会在 HTTP 标头中发送编码。我有一种感觉,市场上的解析器以某种方式完成这项工作,但我不知道如何。 我之前的一篇文章显示,将输入流转换为字节数组然后写入文件会保留格式,因为如果我剥离除二进制数据之外的所有其他内容,我可以从二进制文件中看到完整的 jpeg 图像,将文件另存为 .jpg 扩展名,然后查看。但是当字节数组变成带有某种编码的字符串时,一切都搞砸了。【参考方案2】:

你知道你在字节中间有一个“空行”(假设 0x13 或 0x10 字节值),所以只要寻找那个字节,你就可以分割原始字节数组。第一部分可以简单地映射到字符串,对于二进制数据,您现在有了偏移量、长度和字节数据,这就是您所需要的。

【讨论】:

感谢 alphazero,这是让我思考的最佳建议!我逐字节读取数组,并在遇到 LF+CR 时将其转换为字符串。当它在转换为字节数组时是一个空字符串时,我将所有字节复制到另一个数组中,并在它到达边界时停止。然后,由于后面增加了两个 LF+CR,我用边界长度 +4 截断了字节数组。如果您在文件中混合了二进制数据和文本,是否可以安全地得出结论,如果您想保持二进制完整性,那么操作它的唯一方法是在字节级别? 据我所知。如果您混合使用“数据类型”——意味着字节模式和类型语义之间的不同映射,例如UTF-8——在一个连续的字节块(内存或文件,有什么区别?)中,您自然需要首先将该超级块划分为一组具有统一数据语义的小块。所以,你必须解析。

以上是关于将字节数组转换为字符串时的格式更改的主要内容,如果未能解决你的问题,请参考以下文章

将字节数组转换为字符串 spark

将 ctype 字节数组转换为字节

如何将字符串(字节数组作为字符串)转换为短字符串

如何将字节数组转换为blob

如何将 varbinary 数据(作为字符串)转换为字节数组?

将字节数组转换为字符串并返回字节数组的问题