【发布时间】:2024-01-22 00:56:01
【问题描述】:
我想获取 BINARY 字符串的前四个字节并将其解释为数字。
(背景:我有一个 SHA1 哈希,它已被 UNHEX'ed 到 BINARY(20) 列中,我想创建一个 PARTITION BY HASH 表达式,该表达式采用 SHA1 值的前四个字节并转换或转换它到一个数值,正如 PARTITION BY HASH 表达式所期望的那样。)
实际上不必是四个字节;只是一小部分字节,可以被处理成一个整数值。
【问题讨论】:
我想获取 BINARY 字符串的前四个字节并将其解释为数字。
(背景:我有一个 SHA1 哈希,它已被 UNHEX'ed 到 BINARY(20) 列中,我想创建一个 PARTITION BY HASH 表达式,该表达式采用 SHA1 值的前四个字节并转换或转换它到一个数值,正如 PARTITION BY HASH 表达式所期望的那样。)
实际上不必是四个字节;只是一小部分字节,可以被处理成一个整数值。
【问题讨论】:
我知道这已经晚了,但是,
试试这个:
SELECT CONV(LEFT(HEX(<column_with_bin_str>),8), 16, 10) FROM Table;
这会将二进制字符串转换为十六进制,从转换后的字符串中取出前 8 个十六进制字符并将其转换为十进制。
我们取前 8 个十六进制字符,因为需要两个十六进制字符来表示一个字节。
【讨论】:
您可以结合以下两个功能::
从字符串 str 返回一个子字符串 len 个字符长,从 位置pos。
在不同的数字基数之间转换数字。返回一个字符串 数字 N 的表示,从基数 from_base 转换为基数 to_base。
编辑
如果您需要获取10011001 的前 4 位数字,即1001 = 9,请使用:
SELECT CONV(SUBSTR(10011001, 1, 4), 2, 10)
如果你有前导零你可以使用LPAD函数,例如二进制值01001100的前4位数字是0100 = 4,你可以这样做:
SELECT CONV(
SUBSTR(
LPAD(
CAST(01001100 as char), (LENGTH(CAST(01001100 as char)) + 1), '0'),
1, 4), 2, 10)
【讨论】: