使用SQLite将十六进制转换为文本

时间:2013-03-12 16:20:53

标签: sqlite casting hex ascii

我正在尝试使用纯SQLite语言将表示十六进制数据的字符串转换为十六进制数据的文本编码(ASCII,UTF-8等)。基本上我想要X'[hex]'语法的功能,但应用于以编程方式派生的十六进制字符串。

我想要,例如,select X(hex_data_string) from ...,这不是合法的SQLite语法。

显然在上面的代码片段中,如果数据不是有效的文本编码,我不一定能够输出数据。也就是说,如果hex_data_string包含控制字符等,X()应该以某种方式失败。如果可以,则必须有默认的字符编码,或者必须以某种方式指定所需的字符编码。

询问如何从SQLite数据库中检索十六进制数据字符串值,然后使用C或其他工具进行转换。我试图在纯SQLite中执行此转换,因为我检查了哪些查询返回表示二进制数据的十六进制字符的文本表示。大多数二进制数据都是ASCII,因此我希望能够在适用时快速查看查询输出中二进制数据的内容。

直观地说,我认为这可以通过将十六进制数据字符串转换为blob并使用hex()来完成,但仍然会返回十六进制数据字符串。

有什么想法吗?

可能重复:

SQLite X'...' notation with column data

sqlite char, ascii function

3 个答案:

答案 0 :(得分:5)

这已经很老了,但我一直在寻找同样的东西,所以我想我发布了:

您似乎可以将十六进制数据转换为varchar以将其转换为ascii。

即: select cast(data as varchar) from some_table将返回二进制字段(数据)的字符串表示。

答案 1 :(得分:1)

这在纯SQLite中是不可能的。

作为嵌入式数据库,SQLite旨在仅提供纯数据库功能,并将程序逻辑留给应用程序。 您假设从SQLite数据库中检索十六进制数据字符串值,然后使用C或其他工具进行转换。

如果您控制正在运行查询的程序,则可以安装执行此转换的用户定义函数。

答案 2 :(得分:0)

这不是完全有用的,因为它不能真正用于内联,但我过去曾经这样做过,当时我只想转换一行数据而不是创建/找到另一个实用程序。

WITH RECURSIVE test(c,cur) as (
     select '','686F77647921'
   UNION ALL
    select c || char((case substr(cur,1,1) 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 substr(cur,1,1) end)*16
               + (case substr(cur,2,1) 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 substr(cur,2,1) end)),
substr(cur,3)
from test where length(cur)>0
)
select * from test