Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite如何使用内置函数将BLOB字节转换为INT?_Sqlite_Type Conversion_Blob - Fatal编程技术网

SQLite如何使用内置函数将BLOB字节转换为INT?

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) 我知道没有内置函数

我有一个sqlite数据库,其中包含一个包含BLOB数据的列。
这些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 == ''
;