繁体   English   中英

将字节数组解码为字符串而不会丢失数据

[英]encoding decoding of byte array to string without data loss

我试图将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。 我的意思是Data Changed。

我想要与我编码为字符串和解码到byte []时相同的byte []数据

第一: 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 ,然后使用相同的编码将其转换为字节。

该程序输出Whether a mismatch was found: false ,因此通过ISO-8859-1字节ISO-8859-1 >字符串 - >字节转换产生与开始时相同的数据。

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

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

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

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

有一些特殊的编码,比如base64,用于为纯文本系统编码二进制数据。

如果byte[]根据所选编码包含有效的字节序列,则只保证将byte[]转换为String 未知的字节序列可能会被unicode替换字符替换(如示例所示)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM