我有二進制字串,并希望盡可能緊湊地存盤它們(就磁盤空間而言)。它們可以是“011010010110100110010101”形式的 1 到 ~1000 位。將這些存盤為“TEXT”是一種浪費。我想檢索并將它們轉換回原始二進制字串。SQLite 的 TEXT 型別可以是 UTF-8、UTF-16BE 或 UTF-16LE。
例子:
'0110101011011000001101010010111001101010011101101010100011001101001001010110010010010101010100'
轉換成 :
'櫘?橶?╤鋦'
用于存盤在資料庫中并轉換回原始二進制字串。
我嘗試了許多解決方案,但是二進制字串的格式錯誤,或者字符以某種格式輸出,例如 '\xff\xfe0\x001',這仍然很浪費,或者僅適用于 8 位或 16 位的倍數。
uj5u.com熱心網友回復:
將二進制字串轉換為整數并跟蹤位數。可以生成一個位元組資料的 BLOB 用于存盤,因為如果您有數千位,則會超出 SQLITE INTEGER 的大小。
例子:
import sqlite3
import os
import math
# store string of binary data packed into bytes
def insert(cur, binary):
bit_count = len(binary)
byte_count = math.ceil(bit_count / 8)
byte_data = int(binary, 2).to_bytes(byte_count, 'little')
cur.execute("insert into test values(?, ?)", (bit_count, byte_data))
# set up database
con = sqlite3.connect(':memory:')
cur = con.cursor()
cur.execute('create table test(bit_count, binary)')
con.commit()
# insert some strings
for binary in ['101', '000011', '101010111011011011110001', '0110' * 250]:
insert(cur, binary)
# retrieve, unpack and display
res = cur.execute('select * from test')
for bit_count, byte_data in res:
integer = int.from_bytes(byte_data, 'little')
binary = f'{integer:0{bit_count}b}'
print(binary)
輸出:
101
000011
101010111011011011110001
0110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/530091.html
上一篇:呼叫WinApi函式后RIP損壞
下一篇:將字串正確拆分為陣列陣列
