0

この質問が以前に尋ねられたことは知っていますが、いくつかの提案は、文字列をバイトリテラルにするために ab が必要であるように思われます。ただし、関数に 16 進コードを 0x414243 として渡して、ABC として保存しています。

def _pack(_data, size):
    numofbytes = size/8
    print("Chars Expected: " + str(numofbytes))
    formatString = "{}s".format(int(numofbytes))
    print("Formatted String:" + formatString)
    struct.pack(formatString,_data)

_pack(0x414243,24)

ここで何を変更すればよいかわかりません。フォーマット文字列変数の使用方法に問題があるのではないかと思っています。サイズから渡されたデータに含まれる文字数を関数が計算できるようにしたいのですが、この場合は 24 ビット = 3 バイトなので、3 をフォーマットし、0x414243 を渡して ABC に変換します。

誰でもエラーを回避する方法をアドバイスできますか。

4

1 に答える 1

0

エラーメッセージが示すように、struct.pack()バイトのグループが必要で、整数を指定しています。

データを整数として渡すことができるようにする場合は、パックする前にバイトに変換します。

_data = _data.to_bytes(numofbytes, "big")   # or "little", depending on endianness

または、呼び出すときにデータをバイトとして渡すだけです。

_pack(b"0x410x420x43", 24)

などの 16 進数を含む文字列がある場合は"0x414243"、それを整数に変換してからバイトに変換できます。

_data = int(_data, 16).to_bytes(numofbytes, "big")    

関数がこれらの形式のいずれかを受け入れるようにするために使用isinstance()できます。

if isinstance(_data, str):
    _data = int(_data, 16)
if isinstance(_data, int):
    _data = _data.to_bytes(numofbytes, "big")

ところで、バイト数を計算すると、sizeが 8 の倍数でない場合、浮動小数点数が返されます。小数のバイト数はエラーです。これに対処するには:

numofbytes = size // 8 + bool(size % 8)

+ bool(size % 8)ビットが残っている場合、ビットは整数除算の結果に 1 を追加します。

于 2018-02-24T00:23:23.437 に答える