正規形bencode出力
バイト列、上限付き整数、リスト、バイトキー辞書をキー順の正規bencodeへ変換し、出力を65536バイト以下にしてください。
def bencode(value):
active, visited, used, parts = set(), 0, 0, []
def emit(*chunks):
nonlocal used
size = sum(len(chunk) for chunk in chunks)
if size > 65536 - used:
raise ValueError("bencode.output")
used += size
parts.extend(chunks)
def encode(item, depth):
nonlocal visited
visited += 1
if depth > 16 or visited > 2048:
raise ValueError("bencode.bounds")
if type(item) is int:
if not -10**18 <= item <= 10**18:
raise ValueError("bencode.integer")
emit(b"i", str(item).encode("ascii"), b"e")
elif type(item) is bytes:
if len(item) > 65536:
raise ValueError("bencode.bytes")
emit(str(len(item)).encode("ascii"), b":", item)
elif type(item) in (list, dict):
if id(item) in active or len(item) > 64:
raise ValueError("bencode.container")
active.add(id(item))
try:
emit(b"l" if type(item) is list else b"d")
if type(item) is list:
for child in item:
encode(child, depth+1)
else:
if any(type(k) is not bytes for k in item):
raise ValueError("bencode.key")
for key in sorted(item):
encode(key, depth+1)
encode(item[key], depth+1)
emit(b"e")
finally:
active.remove(id(item))
else:
raise ValueError("bencode.type")
encode(value, 0)
return b"".join(parts)
- プロジェクト
- 空の容器と入れ子を試し、循環、真偽値、±10^18外の整数、容器の64超の項目、16超の深さ、2048超の訪問値を拒否してください。
- 適用前に確認
- 実際の動作を期待する結果と比較します。検証に失敗した場合は、次の変更を加える前に原因を調べてください。
- モデル
- OpenAI互換またはAnthropicのエンドポイントを、ベースURLと必要なAPIキーで設定し、接続をテストします。ローカルのモデルサーバーは起動が必要です。リモートツールは別途データを送信する場合があります。
def bencode(value):
active, visited, used, parts = set(), 0, 0, []
def emit(*chunks):
nonlocal used
size = sum(len(chunk) for chunk in chunks)
if size > 65536 - used:
raise ValueError("bencode.output")
used += size
parts.extend(chunks)
def encode(item, depth):
nonlocal visited
visited += 1
if depth > 16 or visited > 2048:
raise ValueError("bencode.bounds")
if type(item) is int:
if not -10**18 <= item <= 10**18:
raise ValueError("bencode.integer")
emit(b"i", str(item).encode("ascii"), b"e")
elif type(item) is bytes:
if len(item) > 65536:
raise ValueError("bencode.bytes")
emit(str(len(item)).encode("ascii"), b":", item)
elif type(item) in (list, dict):
if id(item) in active or len(item) > 64:
raise ValueError("bencode.container")
active.add(id(item))
try:
emit(b"l" if type(item) is list else b"d")
if type(item) is list:
for child in item:
encode(child, depth+1)
else:
if any(type(k) is not bytes for k in item):
raise ValueError("bencode.key")
for key in sorted(item):
encode(key, depth+1)
encode(item[key], depth+1)
emit(b"e")
finally:
active.remove(id(item))
else:
raise ValueError("bencode.type")
encode(value, 0)
return b"".join(parts)
直列化の変更で互換性と制限を保つ
バイナリ出力は、通常のテキスト差分では変わらなく見えても意味が変わる場合があります。Bencoraは、そのリスクを念頭に直列化コードをレビューするWindows向けAIコーディングワークスペースです。プロジェクトを開き、パッチ提案の前に受け付ける値、出力の契約、利用側のコードを調べるよう接続先モデルに依頼します。
具体的な課題として、メタデータ書き出し処理の正規化されたbencode出力をレビューできます。バイト列キーの順序、入れ子のコンテナー、非対応型の拒否を調べるよう依頼します。既知の出力例を提示し、アプリケーションが必要とする制限を説明してください。妥当に見えるバイトを生成するから無害と考えず、その書き出し処理と呼び出し側に提案の焦点を保ちます。
通常の往復変換とともに資源の境界も確認します。最大深さ、過大な出力、循環コンテナーについて自分でテストを実行し、代表的な辞書の正確なバイトを比較してください。失敗した試行が後の作業を壊さないよう、拒否後の後片付け経路を調べます。互換性には符号化成功の例だけでなく、プロジェクトの利用側からの証拠も必要です。
BencoraはOpenAI互換またはAnthropicのエンドポイントへの接続に対応します。設定したサービスが提供すれば無検閲AIモデルを選べます。ツール、制限、コンテキストはその設定によって決まります。対話で変更を説明し、出力の契約が保たれるかはテストデータで確認してください。
バイナリ書き出し処理を安全にレビューする
復号値だけでなく正確なバイトを比較するのはなぜですか?
同じ復号値でも、正規形式に重要な順序や表現の違いが隠れる場合があります。その要件の既知のバイト列を保持し、プロジェクトで既に使う往復変換のチェックと併せて確認してください。
辞書の順序にはどんな文脈が重要ですか?
実際のキーの型と符号化出力に依存する利用側を示します。バイト順とプログラミング言語固有の文字列順を区別するよう依頼してください。便利な文字列変換が、生のバイトについて定めた契約を変える場合があります。
出力サイズの制限は符号化後だけに確認すべきですか?
必要な資源ポリシーをレビューしてください。最後のサイズ確認では、既に多くの処理やメモリ確保が済んでいる場合があります。提案がどこで制限を適用するか尋ね、許容出力を超える入れ子の値も含め拒否経路をテストします。
循環コンテナーの例を含めるのはなぜですか?
通常の有限木として展開できない入力の扱いを確認するためです。明示的な拒否と後片付けを検証します。モデルの符号化成功例だけでは、不正なコンテナー構造の処理が正しく終了するとは証明できません。
Bencora · 更新日 2026-10-25