3

我正在尝试使用纯 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'...' 表示法

sqlite char,ascii 函数

4

3 回答 3

7

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

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

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

于 2015-05-07T11:52:57.027 回答
1

这在纯 SQLite 中是不可能的。

作为一个嵌入式数据库,SQLite 被设计成只提供纯数据库功能,而将程序逻辑留给应用程序。您应该从 SQLite 数据库中检索十六进制数据字符串值,然后使用 C 或其他工具对其进行转换。

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

于 2013-03-12T18:22:18.457 回答
1

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

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
于 2014-12-12T13:44:55.507 回答