如何基于纯SQLite实现字符串与二进制的双向转换?
SQLite纯SQL实现字符串与二进制互转方案
我来补全这个纯SQLite实现的字符串与二进制互转方案,全程不用任何外部函数,纯CTE递归搞定:
一、字符串转二进制(8位补全格式)
下面是完整的SQL代码,支持任意ASCII范围内的字符串转换,输出是空格分隔的8位二进制串:
-- 字符串转二进制(8位补全,空格分隔) WITH string(s) AS (VALUES('Hello, SQLite!')), -- 替换成你要转换的字符串 bytes(i, byte_val) AS ( -- 递归提取每个字符的Unicode编码 SELECT 1, UNICODE(SUBSTR(s, 1, 1)) FROM string UNION ALL SELECT i + 1, UNICODE(SUBSTR(s, i + 1, 1)) FROM bytes WHERE i < (SELECT LENGTH(s) FROM string) ), binary_bits(bit_pos, bit_str, current_byte) AS ( -- 递归把每个字节拆解为8位二进制(从高位到低位) SELECT 7, '', byte_val FROM bytes UNION ALL SELECT bit_pos - 1, bit_str || ((current_byte >> bit_pos) & 1), current_byte FROM binary_bits WHERE bit_pos >= 0 ) -- 拼接所有8位二进制串,用空格分隔 SELECT GROUP_CONCAT(bit_str, ' ') AS binary_representation FROM binary_bits WHERE bit_pos = 0; -- 只取每个字节拆解完成的结果
逻辑说明:
stringCTE:用来存放要转换的目标字符串,直接修改VALUES里的内容即可。bytesCTE:通过递归逐个提取字符串中每个字符的Unicode十进制值,相当于把字符串拆成单个字节。binary_bitsCTE:对每个字节做位运算,从第7位(最高位)到第0位(最低位)依次提取每一位的值,拼接成8位的二进制字符串。- 最后用
GROUP_CONCAT把所有8位二进制串用空格分隔,得到最终的二进制表示。
二、二进制转字符串(空格分隔的8位输入)
如果要把二进制串转回原字符串,用下面的代码,输入要求是空格分隔的8位二进制片段:
-- 二进制转字符串(输入为空格分隔的8位二进制串) WITH binary_input(bin_str) AS (VALUES('01001000 01100101 01101100 01101100 01101111 00101100 00100000 01010011 01110001 01101000 01101000 01101100 01101001 01110100 00100001')), -- 替换成你的二进制串 split_bits(bit_segment, remaining_str) AS ( -- 递归拆分空格分隔的每个8位二进制段 SELECT SUBSTR(bin_str, 1, 8), SUBSTR(bin_str, 10) FROM binary_input UNION ALL SELECT SUBSTR(remaining_str, 1, 8), SUBSTR(remaining_str, 10) FROM split_bits WHERE remaining_str != '' ), byte_values(byte_dec) AS ( -- 把二进制字符串转成十进制字节值 SELECT CAST(bit_segment AS INTEGER, 2) FROM split_bits ) -- 把每个十进制值转成字符并拼接 SELECT GROUP_CONCAT(CHAR(byte_dec), '') AS original_string FROM byte_values;
逻辑说明:
binary_inputCTE:存放要转换的二进制串,注意格式必须是空格分隔的8位片段。split_bitsCTE:通过递归拆分字符串,把每个8位的二进制段单独提取出来。byte_valuesCTE:用CAST(..., 2)把二进制字符串转换成十进制的字节值。- 最后用
CHAR()把每个十进制值转回字符,再用GROUP_CONCAT拼接成原字符串。
内容的提问来源于stack exchange,提问作者user9171470
相关产品推荐
相关产品推荐

