【问题标题】:How to check blob input string is hex in java?java - 如何检查blob输入字符串是java中的十六进制?
【发布时间】:2016-01-27 22:24:32
【问题描述】:

在我们的产品中,在一个 java 类中,我们以字符串格式接收 Blob,我们需要检查这个传入的 blob 是否是十六进制字符串(Blob 可以是任意大小)并根据布尔结果我们将进一步决定Blob 处理(因为在我们的例子中MS-SQL 返回十六进制,MySQL,Oracle 返回纯Blob)。使用PatternMatchermatches() 来检查传入的Blob 是否是hex 字符串是一种好习惯吗?

以下是我的代码 sn-p :

public static boolean isHexadecimal(String blobdata) {

    Pattern p = Pattern.compile("[0-9a-fA-F]+");
    Matcher m = p.matcher(blobdata);

    if (m.matches()) {
        return true;
    }
    return false;
}

【问题讨论】:

  • 其他选项是什么?如果数据库返回根本不是字符串的“纯 Blob”,不是吗?
  • @Thilo 如果 blob 包含大量数据,它(上面的代码 sn-p)的执行速度会变慢吗?
  • 请说明“纯 Blob”的形式以及您如何从数据库中检索到它。
  • @Thilo ""pure blob" 的意思是,它与返回十六进制字符串的 MS-SQL 不同,我们通过对第三方应用程序的简单选择查询来检索它,然后我们将其接收到字符串的形式。
  • 我真的不明白您希望在blobdata 中收到哪些不同类型的Strings。你能举一个String 代表“纯blob”的例子吗?

标签: java mysql sql-server oracle


【解决方案1】:

正则表达式存在缺陷,因为它仅标记您的 blobdata 包含十六进制的子字符串(甚至没有考虑到连续的十六进制字节数必须是即使它表示八位字节序列)。使用开始/结束锚来纠正:

Pattern p = Pattern.compile("^[0-9a-fA-F]+$");

另一种方法可能是反转匹配以排除 Blob 中出现非十六进制数据的可能性。当然,这只有在您确实在仅使用十六进制内容时才可行:

public static boolean isHexadecimal(String blobdata) {

    Pattern p = Pattern.compile("[^0-9a-fA-F]");
    Matcher m = p.matcher(blobdata);

    if (m.matches()) {
        return false;
    }
    return true;
}

【讨论】:

    【解决方案2】:

    这里是一些示例代码

    public class HexTester
    {
      private static Pattern pattern = Pattern.compile ("^[0-9a-fA-F]+$");
    
      public static void main (String[] args)
      {
        System.out.println (isHexadecimal ("0102"));
        System.out.println (isHexadecimal ("xx0102"));
        System.out.println (isHexadecimal ("deadbeef"));
        System.out.println (isHexadecimal ("xxdeadbeef"));
      }
    
      private static boolean isHexadecimal (String blobdata)
      {
        Matcher m = pattern.matcher (blobdata);
        return m.matches ();
      }
    }
    

    如果发现任何十六进制字符,您的正则表达式将返回 true,这会检查整个字符串是否为有效的十六进制。

    另外,模式应该只编译一次,而不是每次调用函数时。

    如果你想确保十六进制数字总是成对出现,你可以使用这个

    private static Pattern pattern = Pattern.compile ("^(?:[0-9a-fA-F]{2})+$");
    

    【讨论】:

    • 如果我的 blob 很大怎么办?它(matches())会在执行过程中消耗时间吗?
    猜你喜欢
    • 2017-03-04
    • 2010-11-26
    • 1970-01-01
    • 2012-04-27
    • 2011-08-19
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    相关资源
    最近更新 更多