Java 你被字符串愚弄了?
你好,我正在编写一些代码,我发现了一些有趣的东西。所以我用十六进制编码这个二进制字符串,叫做hexBinary。数据库中的信息是这种格式的,但有些数据仍然是纯文本,这不是问题,因为当我执行以下操作时:Java 你被字符串愚弄了?,java,hex,Java,Hex,你好,我正在编写一些代码,我发现了一些有趣的东西。所以我用十六进制编码这个二进制字符串,叫做hexBinary。数据库中的信息是这种格式的,但有些数据仍然是纯文本,这不是问题,因为当我执行以下操作时: return DatatypeConverter.parseHexBinary(s) 如果输入不是hexBinary,它将返回bytes[]或抛出异常,但该机制被我用于测试的字符串“愚弄”,该字符串是“aaaa”,这将在以后给我带来问题 为什么这个字符串被解析为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可以用作二进制数字,因此
aaaa
是一个完美的二进制数(值43690)。字母p不能,因此depp
无效,因此异常。“aaaa”是有效的十六进制字符串。“depp”不是。虽然这是很遥远的事情,但我不知道有什么办法可以避免这样的事情吗?或者甚至知道什么是纯文本名称,什么是十六进制,就像我举的一个例子,有一个很好的验证,谢谢大家和你的反馈。