我有一个值为[B@6c89db9a
的字节数组我已将此值存储在MySQL数据库中作为字符串表示形式 - mybyteArray.toString()
我想从数据库中检索保存的值,并使用原始字节数组的字符串值创建一个新的字节数组。
我已尝试过示例Java Byte Array to String to Byte Array
和byte to string and vice versa
但是我没有得到原始的字节数组值。它产生了不同的价值。任何人都可以建议吗?
答案 0 :(得分:8)
我有一个带有值的字节数组[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
:
String myString = new String(bytes, knownCharset);
例如,如果它们代表UTF-8字符串,您将使用:
String myString = new String(byteArray, Charset.forName("UTF-8"));
答案 1 :(得分:4)
记录:
另一个解决方案是存储base64编码的字节数组,参见 https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html
问题太旧了,所以我不打算详细说明。
答案 2 :(得分:0)
返回对象的字符串表示形式。通常,toString方法返回一个“文本表示”此对象的字符串。结果应该是一个简洁但信息丰富的表示,便于人们阅读。建议所有子类都覆盖此方法。
类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@”和对象的哈希码的无符号十六进制表示组成。
换句话说,此方法返回一个等于值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())
因此,您要保存的内容不包含字节数组的实际值。
答案 3 :(得分: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;
}
}