SQLite如何使用内置函数将BLOB字节转换为INT?
我有一个sqlite数据库,其中包含一个包含BLOB数据的列。SQLite如何使用内置函数将BLOB字节转换为INT?,sqlite,type-conversion,blob,Sqlite,Type Conversion,Blob,我有一个sqlite数据库,其中包含一个包含BLOB数据的列。 这些BLOB数据的宽度为4字节。我想将4个字节拆分为appart,并将每个部分转换为一个整数值进行计算。 我发现,我可以使用SUBSTR(val,start,length)获取BLOB值appart。结果仍然是BLOB类型。 但是如何将BLOB/字节转换为整数值? 是否有可以将字节BLOB值转换为整数的内置函数? 或者有没有办法将十六进制字符串值转换成整数值,这样我就可以使用hex(val)或QUOTE(val) 我知道没有内置函数
这些BLOB数据的宽度为4字节。我想将4个字节拆分为appart,并将每个部分转换为一个整数值进行计算。
我发现,我可以使用
SUBSTR(val,start,length)
获取BLOB值appart。结果仍然是BLOB类型。但是如何将BLOB/字节转换为整数值?
是否有可以将字节BLOB值转换为整数的内置函数?
或者有没有办法将十六进制字符串值转换成整数值,这样我就可以使用
hex(val)
或QUOTE(val)
我知道没有内置函数,所以我就是这样做的-如果您知道要转换多少字节:
--creates table h2i with numbers 0 to 255 in hex and int
CREATE TEMP TABLE bits (bit INTEGER PRIMARY KEY);INSERT INTO bits VALUES (0);INSERT INTO bits VALUES (1);
CREATE TEMP TABLE h2i (h TEXT, i INT);
INSERT INTO h2i (h, i) SELECT printf('%02X',num),num FROM (SELECT b7.bit * 128 + b6.bit * 64 + b5.bit * 32 + b4.bit * 16 + b3.bit * 8 + b2.bit * 4 + b1.bit * 2 + b0.bit AS num FROM bits b7, bits b6, bits b5,bits b4, bits b3, bits b2, bits b1, bits b0) as nums;
SELECT
HEX(SUBSTR(val, 1, 1)),h2i0.i
,HEX(SUBSTR(val, 2, 1)),h2i1.i
,HEX(SUBSTR(val, 3, 2)),h2i2.i*256+h2i3.i
,HEX(SUBSTR(val, 1, 4)),h2i0.i*16777216+h2i1.i*65536+h2i2.i*256+h2i3.i
FROM test
JOIN h2i h2i0 ON h2i0.h=HEX(SUBSTR(val, 1, 1))
JOIN h2i h2i1 ON h2i1.h=HEX(SUBSTR(val, 2, 1))
JOIN h2i h2i2 ON h2i2.h=HEX(SUBSTR(val, 3, 1))
JOIN h2i h2i3 ON h2i3.h=HEX(SUBSTR(val, 4, 1))
;
@rayzinz,谢谢你的提示 与此同时,我放弃了。 我拼凑了一种解决方案,但我从未使用递归构造从外部设置初始x'cafe1a7e'值
WITH RECURSIVE fx(val_hex, val_int, iter) AS (
VALUES(HEX(x'cafe1a7e'), 0, 0)
UNION ALL
SELECT
SUBSTR(val_hex, 1, LENGTH(val_hex) - 1),
val_int + (
CASE SUBSTR(val_hex, -1)
WHEN '0' THEN 0
WHEN '1' THEN 1
WHEN '2' THEN 2
WHEN '3' THEN 3
WHEN '4' THEN 4
WHEN '5' THEN 5
WHEN '6' THEN 6
WHEN '7' THEN 7
WHEN '8' THEN 8
WHEN '9' THEN 9
WHEN 'A' THEN 10
WHEN 'B' THEN 11
WHEN 'C' THEN 12
WHEN 'D' THEN 13
WHEN 'E' THEN 14
WHEN 'F' THEN 15
ELSE 0
END << (iter * 4)
),
iter + 1
FROM fx
WHERE val_hex != ''
LIMIT 9
)
--SELECT * FROM fx
SELECT val_int FROM fx WHERE val_hex == ''
;
使用递归fx(val_hex,val_int,iter)作为(
值(十六进制(x'cafe1a7e'),0,0)
联合所有
挑选
SUBSTR(val_hex,1,长度(val_hex)-1),
瓦尔_int+(
案例SUBSTR(val_hex,-1)
当“0”时,则为0
当“1”时,则为1
当'2'时,则为2
当“3”时,则为3
当“4”时,则为4
什么时候是“5”然后是“5”
什么时候是‘6’然后是‘6’
当‘7’然后是‘7’
当‘8’然后是‘8’
当'9'然后是9
当‘A’那么10
什么时候是B,然后是11
当‘C’然后是12
那是什么时候
当‘E’时,则为14
当‘F’然后是15
其他0
结束
WITH RECURSIVE fx(val_hex, val_int, iter) AS (
VALUES(HEX(x'cafe1a7e'), 0, 0)
UNION ALL
SELECT
SUBSTR(val_hex, 1, LENGTH(val_hex) - 1),
val_int + (
CASE SUBSTR(val_hex, -1)
WHEN '0' THEN 0
WHEN '1' THEN 1
WHEN '2' THEN 2
WHEN '3' THEN 3
WHEN '4' THEN 4
WHEN '5' THEN 5
WHEN '6' THEN 6
WHEN '7' THEN 7
WHEN '8' THEN 8
WHEN '9' THEN 9
WHEN 'A' THEN 10
WHEN 'B' THEN 11
WHEN 'C' THEN 12
WHEN 'D' THEN 13
WHEN 'E' THEN 14
WHEN 'F' THEN 15
ELSE 0
END << (iter * 4)
),
iter + 1
FROM fx
WHERE val_hex != ''
LIMIT 9
)
--SELECT * FROM fx
SELECT val_int FROM fx WHERE val_hex == ''
;