2017-05-19 7 views
0

struct.unpackを使用して、データが固定されていないために送信されたbytearrayのデータを確認する方法がわかりません。これは可変長のパック10進形式で、16進文字で終了します。データ型はSQL_DECIMALです。私は123を期待していた場合pyodbc出力コンバーターでデータを展開できません

は例えば、私は勝つ7に、Pythonの3.4.3 pyodbc 4.0.1を使用しています

...... \ X12 \ Spark Proのように印刷ByteArrayの値を参照してください

+0

したがって、1234は '\ x12 \ x34'、12345は' \ x12 \ x34 \ x5e'になりますか? –

+0

はい。 1234は\ x12 \ x34 \ xe0となります。 ところで、私はニブルを解析するコードを書いたが、私は何かpyononicしたい。 – ZevGriner

答えて

0

これは「PARS [INGの]ニブル」としての資格またはあなたのために十分な「神託」である場合、私は知りませんが、これは動作するようです:テストデータについては

import itertools 


def convert_packed_decimal(byte_stream): 
    digit_list = list(itertools.chain.from_iterable([[(b & 0xF0) >> 4, b & 0xF] for b in byte_stream])) 
    num_digits = digit_list.index(0xE) 
    return sum([digit_list[i] * 10 ** (num_digits - i - 1) for i in range(num_digits)]) 


if __name__ == '__main__': 
    print(convert_packed_decimal(b'\x12\x34\xe0')) 
    print(convert_packed_decimal(b'\x90\x21\x0e')) 

b'\x12\x34\xe0'、関数の最初の行はリスト内包をeネストされたリスト内の個々の数字

[[1,2],[3,4],[14,0]] 

、その後list(itertools.chain.from_iterable(...は、単純なリストにそれを平らにxtract。

[1,2,3,4,14,0] 

2行目は、(この場合、4)私たちプロセスの桁数を与え、0xE(小数14)タ​​ーミネーターのインデックスを見つけます。

三行目は

[1 * 1000, 2 * 100, 3 * 10, 4 * 1] 

、リスト中のその位置に対応する10の力を掛け、各桁を処理するリスト内包を使用し、次いでsum(...、それらを加算します。

関連する問題