3

純粋な SQLite 言語を使用して、16 進数データを表す文字列から 16 進数データのテキスト エンコーディング (ASCII、UTF-8 など) に変換しようとしています。基本的に、X'[hex]'構文の機能が必要ですが、プログラムで派生した 16 進文字列に適用されます。

たとえば、select X(hex_data_string) from ...正当な SQLite 構文ではない が必要です。

明らかに、上記のスニペットでは、データが有効なテキスト エンコーディングでない場合、必ずしもデータを出力できるとは限りません。つまり、hex_data_string制御文字などが含まれている場合X()、 は何らかの形で失敗するはずです。これが可能であれば、デフォルトの文字エンコーディングが存在するか、目的の文字エンコーディングを何らかの方法で指定する必要があります。

SQLite データベースから 16 進データ文字列値を取得し、C またはその他の機能を使用してそれを変換する方法について質問しているわけではありません。バイナリ データを表す 16 進文字のテキスト表現を返すクエリがあるため、純粋な SQLite でこの変換を実行しようとしています。バイナリ データのほとんどは ASCII であるため、必要に応じてクエリ出力でバイナリ データの内容をすばやく表示できるようにしたいと考えています。

直感的に、これは 16 進データ文字列をブロブにキャストして使用することで実現できると考えましたhex()が、それでも 16 進データ文字列が返されます。

何か案は?

可能な重複:

列データを使用した SQLite X'...' 表記

sqlite char、ASCII 関数

4

3 に答える 3

1

実際にはインラインで使用できないため、これは完全には役に立ちませんが、過去に、別のユーティリティを作成/検索せずに 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 に答える
1

これは純粋な SQLite では不可能です。

組み込みデータベースとして、SQLite は純粋なデータベース機能のみを提供し、プログラム ロジックをアプリケーションに任せるように設計されています。SQLite データベースから 16 進データ文字列値を取得し、C またはその他の機能を使用して変換することになっています

クエリを実行しているプログラムを制御する場合は、この変換を行うユーザー定義関数をインストールできます。

于 2013-03-12T18:22:18.457 に答える