ParseHexBinary 被字符串骗了?
ParseHexBinary being fooled by string?
你好,我正在编写一些代码,我发现了一些有趣的东西。所以我有这个二进制字符串,用十六进制编码,称为 hexBinary。我来自数据库的信息采用这种格式,但有些数据仍然是纯文本格式,这不是问题,因为当我执行以下操作时:
return DatatypeConverter.parseHexBinary(s)
如果输入不是 hexBinary,它将 return bytes[] 或抛出异常,但这种机制被我用于测试的字符串“愚弄”了,它是“ aaaa" 稍后会给我问题。
为什么这个字符串被解析为 hexBinary 而我使用的其他纯文本字符串如“depp”没有被转换为 bytes[](如果它们只是纯文本我实际上不想要)
例如,我拥有的十六进制二进制文件是这样的:B3ABE2E0F609C1CC5D63CE5A1DA1708E
如果只是纯文本,是否有任何类型的正则表达式或验证器可以用来避免处理 IllegalArgumentExceptions?
来自 Db 的所有信息都以字符串形式出现
十六进制数表示以 16 为基数的数字。由于需要 16 个不同的数字来编写这样的数字,因此它由数字 0 到 9 和字母 a 到 f(代表数字 10 到 15)组成。您可以自己看到您的示例 B3ABE2E0F609C1CC5D63CE5A1DA1708E
根据此定义是一个十六进制数。字母可以是大写也可以是小写,没关系也没有区别。
所以aaaa
是一个完美的十六进制数。它的十进制等价物是 43690.
因此,如果您得到 aaaa
或仅由字母 a–f 组成的单词,例如 dad
、beef
、deaf
、cafe
、[ =17=、feed
、babe
或 faded
,您真的没有办法判断这是十六进制数还是来自不同上下文的单词错误地传送给您。您已经在做的解析是在您的情况下会做的标准验证。所以你可以考虑接受它。
如果您想要更严格的验证而不拒绝善意的十六进制数,有几个想法是:
- 如果您知道您的十六进制数字始终包含大写字母 A–F,请拒绝任何包含小写字母的输入。
- 如果您知道您的十六进制数始终具有特定长度或特定最小长度,请拒绝较短的输入字符串。
Link: Hexadecimal Numbers
你好,我正在编写一些代码,我发现了一些有趣的东西。所以我有这个二进制字符串,用十六进制编码,称为 hexBinary。我来自数据库的信息采用这种格式,但有些数据仍然是纯文本格式,这不是问题,因为当我执行以下操作时:
return DatatypeConverter.parseHexBinary(s)
如果输入不是 hexBinary,它将 return bytes[] 或抛出异常,但这种机制被我用于测试的字符串“愚弄”了,它是“ aaaa" 稍后会给我问题。
为什么这个字符串被解析为 hexBinary 而我使用的其他纯文本字符串如“depp”没有被转换为 bytes[](如果它们只是纯文本我实际上不想要)
例如,我拥有的十六进制二进制文件是这样的:B3ABE2E0F609C1CC5D63CE5A1DA1708E
如果只是纯文本,是否有任何类型的正则表达式或验证器可以用来避免处理 IllegalArgumentExceptions?
来自 Db 的所有信息都以字符串形式出现
十六进制数表示以 16 为基数的数字。由于需要 16 个不同的数字来编写这样的数字,因此它由数字 0 到 9 和字母 a 到 f(代表数字 10 到 15)组成。您可以自己看到您的示例 B3ABE2E0F609C1CC5D63CE5A1DA1708E
根据此定义是一个十六进制数。字母可以是大写也可以是小写,没关系也没有区别。
所以aaaa
是一个完美的十六进制数。它的十进制等价物是 43690.
因此,如果您得到 aaaa
或仅由字母 a–f 组成的单词,例如 dad
、beef
、deaf
、cafe
、[ =17=、feed
、babe
或 faded
,您真的没有办法判断这是十六进制数还是来自不同上下文的单词错误地传送给您。您已经在做的解析是在您的情况下会做的标准验证。所以你可以考虑接受它。
如果您想要更严格的验证而不拒绝善意的十六进制数,有几个想法是:
- 如果您知道您的十六进制数字始终包含大写字母 A–F,请拒绝任何包含小写字母的输入。
- 如果您知道您的十六进制数始终具有特定长度或特定最小长度,请拒绝较短的输入字符串。
Link: Hexadecimal Numbers