【问题标题】:Convert from byte array to string and string to byte array in java [duplicate]在java中从字节数组转换为字符串和字符串到字节数组[重复]
【发布时间】:2011-09-22 01:12:43
【问题描述】:

可能重复:
Conversion of byte[] into a String and then back to a byte[]

我有以下一段代码,我试图通过测试,但似乎无法理解 Java 世界中各种形式的编码。

import java.util.Arrays;

class Test {

static final byte[] A = { (byte)0x11, (byte)0x22, (byte)0x33, (byte)0x44, (byte)0x55, (byte)0x66, (byte)0x77, (byte)0x88, (byte)0x99, (byte)0x00, (byte)0xAA };

public static void main(String[] args) {

    String s = new String(A);

    byte[] b = s.getBytes();

    if (Arrays.equals(A,b)) { 
       System.out.println("TEST PASSED!"); 
    }
    else {
       System.out.println("TEST FAILED!");
    }

}
}

我想我的问题是:将任意字节的字节数组转换为 Java 字符串的正确方法是什么,然后再将相同的 Java 字符串转换为另一个字节数组,该数组的长度和内容与原始字节数组?

【问题讨论】:

  • 我测试通过了,你确定你运行的是最新的代码吗?
  • 你的原始字节数组的编码是什么?
  • @Mike K:ideone.com/To8IK
  • @MarkElliot:这是一些二进制数据,A 没有底层的“编码”。
  • @Xander Tulip 如果有字符串,总是有编码。如果您单独打印出for(byte iB : b) System.out.println(Integer.toHexString(iB )); 的字节,您会看到问题从0x88 开始。

标签: java string bytearray


【解决方案1】:

尝试特定的编码:

String s = new String(A, "ISO-8859-1");

byte[] b = s.getBytes("ISO-8859-1");

ideone link

【讨论】:

  • 这看起来成功了。我是一个后续问题,使用 java String 跨 JNI 边界传递字节数组是否正确?
  • @XanderTulip 我对 JNI 不是很熟悉,但通常使用字符串来表示字节数组可能是有损的。这个没有 jbyteArray 类型吗?
  • @XanderTulip 你可以跨 JNI 边界传递字节数组。见java.sun.com/developer/onlineTraining/Programming/JDCBook/…
【解决方案2】:

使用 Base64。

Apache Commons Codec 有一个Base64 class,它支持以下接口:

String str = Base64.encodeBase64String(bytes);
byte[] newBytes = Base64.decodeBase64(str);

【讨论】:

  • 这似乎是一种非常全面的方法来完成一个非常具体和简单的字符串转换,此外它需要使用非标准的 java 库,不确定 OP 是否考虑到这一点。这是开玩笑的答案吗? ;)
  • 是的,它是迂回的。不,这不是开玩笑的答案=) OP 表示字节是任意的。如果平台不支持他选择的编码(魔术!)或者字节数组包含编码不支持的值,则会引发异常。即使假设他选择了正确的编码,拥有一个回归测试套件并且从不打算移动平台,他也可能将 Apache Commons 用于其他用途 - 这是一个非常常见的库。附言。为迟到的反应道歉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
相关资源
最近更新 更多