【问题标题】:Java - Store byte array as String in DB and create byte array using String valueJava - 将字节数组作为字符串存储在数据库中,并使用字符串值创建字节数组
【发布时间】:2013-07-04 02:39:19
【问题描述】:

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

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

我试过Java Byte Array to String to Byte Array的例子

byte to string and vice versa

但是我没有得到原始字节数组值。它正在产生不同的价值。谁能给点建议?

【问题讨论】:

  • 我有一个字节数组,其值为 [B@6c89db9a 我已存储此值... ...这不是一个值。这是一个完全没用的(Java 之外的)哈希码。数组的toString() 方法打印数组的内容。
  • 是的,我正在使用它进行身份验证,因此我需要存储它

标签: java mysql bytearray


【解决方案1】:

记录在案:

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

问题太老了,我就不细说了。

【讨论】:

    【解决方案2】:

    我有一个字节数组,其值为 [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();
    

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

    String myString = new String(bytes, knownCharset); 
    

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

    String myString = new String(byteArray, Charset.forName("UTF-8"));
    

    【讨论】:

    • 我使用的框架不支持 BLOB 或 CLOB。因此,我认为我可以使用 toString 在数据库中存储字节数组并检索字符串并重新创建原始字节数组。这可能吗?
    • 你以为……错了。数组toString() 的结果在 JVM 内部之外完全没有意义。
    • 好的,你能建议我如何在不使用 blob 等的情况下将字节数组存储在 dB 中吗?
    • 我的回答涵盖了两种可能的解决方案。您唯一可以做的另一件事(荒谬、骇人听闻、没人会这样做)是将字节数组转换为 JSON 格式的数字数组并以这种方式存储。
    【解决方案3】:

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

        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;
              }
          }
    

    【讨论】:

      【解决方案4】:

      根据Object.toString()-

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

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

      换句话说,这个方法返回一个字符串等于:

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

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

      【讨论】:

      • 由于框架限制,我无法使用 CLOB 或 BLOB。我正在尝试将数据库中的二进制数组值保存为字符串。然后检索保存的值并将其作为字节数组放回。这可能吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      相关资源
      最近更新 更多