java - 将字节数组编码解码为字符串而不丢失数据

标签 java arrays string decode encode

我尝试将 byte[] 转换为字符串,如下所示:

Map<String, String> biomap = new HashMap<String, String>();
biomap.put("L1", new String(Lf1, "ISO-8859-1"));

其中 Lf1 是 byte[] 数组,然后我将此字符串转换为 byte[]: 问题是,当我将字节数组转换为字符串时,它会像:

FMR  F P�d@� �0d@r (@� ......... etc

String SF1 = biomap.get("L1");
byte[] storedL1 = SF1.getBytes("ISO-8859-1")

当我将其转换回字节数组并比较两个数组时,它返回 false。我的意思是数据已更改。

我想要与编码为字符串并解码为字节[]时相同的字节[]数据

最佳答案

首先:如果使用此编码将任意字节数组转换为字符串,ISO-8859-1 不会导致任何数据丢失。考虑以下程序:

public class BytesToString {
    public static void main(String[] args) throws Exception {
        // array that will contain all the possible byte values
        byte[] bytes = new byte[256];
        for (int i = 0; i < 256; i++) {
            bytes[i] = (byte) (i + Byte.MIN_VALUE);
        }

        // converting to string and back to bytes
        String str = new String(bytes, "ISO-8859-1");
        byte[] newBytes = str.getBytes("ISO-8859-1");

        if (newBytes.length != 256) {
            throw new IllegalStateException("Wrong length");
        }
        boolean mismatchFound = false;
        for (int i = 0; i < 256; i++) {
            if (newBytes[i] != bytes[i]) {
                System.out.println("Mismatch: " + bytes[i] + "->" + newBytes[i]);
                mismatchFound = true;
            }
        }
        System.out.println("Whether a mismatch was found: " + mismatchFound);
    }
}

它使用所有可能的字节值构建一个字节数组,然后使用 ISO-8859-1 将其转换为 String,然后使用相同的编码将其转换回字节.

该程序输出是否发现不匹配:false,因此通过ISO-8859-1进行字节->字符串->字节转换会产生与原来相同的数据一开始。

但是,正如评论中指出的那样,String 并不是二进制数据的良好容器。具体来说,这样的字符串几乎肯定会包含无法打印的字符,因此如果您打印它或尝试通过 HTML 或其他方式传递它,您将会遇到一些问题(例如数据丢失)。

如果您确实需要将字节数组转换为字符串(并不透明地使用它),请使用 base64 编码:

String stringRepresentation = Base64.getEncoder().encodeToString(bytes);
byte[] decodedBytes = Base64.getDecoder().decode(stringRepresentation);

它需要更多空间,但生成的字符串在打印方面是安全的。

关于java - 将字节数组编码解码为字符串而不丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44602854/

相关文章:

java - 如何使用 JMXWS WS 连接器 (JSR-262) 启动 VisualVM?

java - OWL API 从多行注释中删除空行

php - 解析sql响应数组

c - 为什么当我超出另一个数组的边界时 printf() 的输出会发生变化?

php - 将变量连接到 $_POST[]

java - 将 YUV 网络摄像头图像转换为 java 字节数组

Java Swing OSX 窗口菜单图标对齐

arrays - Scala 分配顺序索引数组

javascript - 如何按索引从数组中删除多个元素?

java - HashMap UUID 或 String 作为键?