4

我有一个字节数组,其值[B@6c89db9a我已将此值作为字符串表示形式存储在 MySQL 数据库中 -mybyteArray.toString()

我想从数据库中检索保存的值,并使用原始字节数组的字符串值创建一个新的字节数组。

我已经尝试过Java Byte Array to String to Byte Array的示例

字节到字符串,反之亦然

但是我没有得到原始的字节数组值。它正在产生不同的价值。有人可以请教吗?

4

4 回答 4

11

我有一个字节数组,其值为 [B@6c89db9a 我已存储此值...

那不是一个值。这是一个完全没用的(Java 之外的)哈希码。数组的toString()方法打印数组的内容。数组不会覆盖toString(),因此Object.toString()会被调用。

如果你想在 MySQL 中存储一个任意字节的数组,你会想使用一个BLOB类型(或者也许VARBINARY?自从我使用 MySQL 已经有一段时间了,但从快速谷歌中可以看出它们在现代版本中基本相同)在您的表中,并存储字节:

创建表示例(some_bytes BLOB);

您准备好的声明如下所示:

String query = "INSERT INTO example (some_bytes) VALUES (?)";
PreparedStatement pstmt = conn.prepareStatement(query);

您可以通过以下方式插入这些字节:

pstmt.setBytes(1, myByteArray);
pstmt.execute();

编辑以添加注释:数组中有一些字节。如果这些字节表示一串字符并且您知道字符集是什么,则String使用String带有字符集的构造函数将它们转换为 a:

String myString = new String(bytes, knownCharset); 

例如,如果它们代表 UTF-8 字符串,您将使用:

String myString = new String(byteArray, Charset.forName("UTF-8"));
于 2013-07-06T00:10:13.477 回答
4

作为记录:

另一种解决方案是存储 base64 编码的字节数组,请参阅 https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html

这个问题太老了,所以我不打算详细说明。

于 2015-04-30T16:40:16.000 回答
0

您可以尝试以下两个功能来完成您的转换工作:

    public static byte[] toBytes(String s) {
    try {
      return s.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
      System.out.println("UTF-8 not supported?", e);
      return null;
    }
    } 

      public static String toString(final byte [] b, int off, int len) {
          if (b == null) {
             return null;
          }
          if (len == 0) {
             return "";
          }
          try {
            return new String(b, off, len, "UTF8");
          } catch (UnsupportedEncodingException e) {
          System.out.println("UTF-8 not supported?", e);
          return null;
          }
      }
于 2013-07-06T00:36:54.567 回答
0

根据Object.toString()——

返回对象的字符串表示形式。通常,toString 方法返回一个“以文本方式表示”该对象的字符串。结果应该是一个简洁但信息丰富的表示,易于人们阅读。建议所有子类重写此方法。

Object 类的 toString 方法返回一个字符串,该字符串由对象作为其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示形式组成。

换句话说,此方法返回一个等于以下值的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode())

因此,您保存的内容包含字节数组的实际值。

于 2013-07-06T00:02:27.197 回答