Java 你被字符串愚弄了?

Java 你被字符串愚弄了?,java,hex,Java,Hex,你好,我正在编写一些代码,我发现了一些有趣的东西。所以我用十六进制编码这个二进制字符串,叫做hexBinary。数据库中的信息是这种格式的,但有些数据仍然是纯文本,这不是问题,因为当我执行以下操作时: return DatatypeConverter.parseHexBinary(s) 如果输入不是hexBinary,它将返回bytes[]或抛出异常,但该机制被我用于测试的字符串“愚弄”,该字符串是“aaaa”,这将在以后给我带来问题 为什么这个字符串被解析为hexBinary,而我使用的其

你好,我正在编写一些代码,我发现了一些有趣的东西。所以我用十六进制编码这个二进制字符串,叫做hexBinary。数据库中的信息是这种格式的,但有些数据仍然是纯文本,这不是问题,因为当我执行以下操作时:

return DatatypeConverter.parseHexBinary(s) 
如果输入不是hexBinary,它将返回bytes[]或抛出异常,但该机制被我用于测试的字符串“愚弄”,该字符串是“aaaa”,这将在以后给我带来问题

为什么这个字符串被解析为hexBinary,而我使用的其他纯文本字符串(如“depp”)没有被转换为字节[](如果它们只是纯文本,我实际上不希望转换为字节[])

我有一个十六进制二进制文件,例如:B3ABE2E0F609C1CC5D63CE5A1DA1708E

如果只是纯文本,是否有任何类型的正则表达式或验证器可以用来避免处理IllegalArgumentException


从数据库中输出的所有信息都是字符串

十六进制数字表示以16为基数的数字。因为写这样的数字需要16个不同的数字,所以它由数字0到9和字母a到f(对于数字10到15)组成。您可以自己看到您的示例,
B3ABE2E0F609C1CC5D63CE5A1DA1708E
,根据此定义是一个十六进制数。字母可以是大写或小写,这无关紧要,也没有任何区别

所以
aaaa
是一个完美的十六进制数。它的十进制等价物是43690

因此,如果你得到了
aaaa
或者一个只由字母a-f组成的单词,比如
dad
beef
聋子
咖啡馆
死亡
饲料
babe
,或者
褪色
,那么你就可以得到这些单词了,你真的没有办法知道这是一个十六进制数,还是一个来自不同上下文的单词被错误地传递给你。您已经在进行的解析是在您的情况下进行的标准验证。所以你可以考虑和它一起生活。

如果您希望在不拒绝善意的十六进制数的情况下进行更严格的验证,有以下几种想法:

  • 如果您知道十六进制数字总是大写字母A–F,请拒绝任何包含小写字母的输入
  • 如果您知道您的十六进制数始终具有某个长度或某个最小长度,请拒绝较短的输入字符串

  • 链接:

    也许您的数据库文档中描述了十六进制二进制格式?字母a到f可以用作二进制数字,因此
    aaaa
    是一个完美的二进制数(值43690)。字母p不能,因此
    depp
    无效,因此异常。“aaaa”是有效的十六进制字符串。“depp”不是。虽然这是很遥远的事情,但我不知道有什么办法可以避免这样的事情吗?或者甚至知道什么是纯文本名称,什么是十六进制,就像我举的一个例子,有一个很好的验证,谢谢大家和你的反馈。