2016-11-18 11 views
0

私は、16進のEBCDIC形式でデータを受け取ってASCIIに変換する関数を持っています。Pythonとebcdicのデコード(zos 1047)

たとえば、データを変換すると、F1F1F0F0は私にASCIIで1100、または16進ASCIIで31313030を与えます。

私は何を見つけたことはこれです:

def __decode_ASC_EBCDIC_DT(self, data): 
    if (data[0] == '3'): 
     #HEX ASCII 
     dt_ = ''.join(chr(int(data[i:i + 2], 16)) for i in range(0, len(data), 2)) 
     return dt_ 
    elif (data[0] == 'F'): 
     #HEX EBCDIC 
     try: 
      tmp = bytearray(ord(c) for c in data) 
      dt_ = ''.join(tmp.decode('cp500')) 
     except: 
      print('can\'t convert:' + data) 
     return dt_ 

が、CP500が「AAAA」に私のデータをtransfromingされており、この場合には、これは間違っているようです。 (tmpは正しいbytearray(b'F1F1F0F0 '))

私はEBCDICのための私自身の辞書を作るべきですか?

答えて

0

上記のコードに誤りがあることでした入力は16進数として扱う必要があります(Kevinに感謝します)。

訂正コード:ウィキから

def __decode_ASC_EBCDIC_DT(self, data): 
if (data[0] == '3'): 
    #HEX ASCII 
    dt_ = ''.join(chr(int(data[i:i + 2], 16)) for i in range(0, len(data), 2)) 
    return dt_ 
elif (data[0] == 'F'): 
    #HEX EBCDIC 
    try: 
     dt_ = ''.join(bytearray.fromhex(data).decode('cp500')) 
    except: 
     print('can\'t convert:' + data) 
    return dt_ 
1

bytearray(b'F1F1F0F0 ')は、あなたが思っているようなものではありません。これはASCII文字列 'F1F1F0F0'のバイト表現です。あなたは、ビューのEBCDICの点から、ISで渡している何

>>input = bytearray(b'F1F1F0F0') 
>>> for item in input: print(item) 
70 
49 
70 
49 
70 
48 
70 
48 

は、無意味:EBCDIC 48、49、および70が定義されていないので、codecs.decodeは無意味な出力を与えるために起こっています。

私はあなたからの入力を取得している場所がわからないんだけど、あなたはASCIIにEBCDIC文字列を変換したい場合は、あなたがこれを行うことができます:

>>> input=bytearray([241, 241, 240, 240]) 
>>> for item in input: print(item) 
241 
241 
240 
240 
>>> import codecs 
>>> codecs.decode(input, 'cp500') 
'1100' 
+0

、テーブルを見て(例えばEBCDICコードページを00037) https://en.wikipedia.org/wiki/EBCDIC_037 私が手の文字列行F +列1の表現= F1 => 1 – Bogdan

+0

あなたはBYTARRAYに関して正しいですが、それは私の悪いことですが、EBCDICの16進数でcidecs.decodeを使用する別の方法、またはHEX ebcdicを変換する方法がありますbytearrayに? – Bogdan

+0

あなたが何を求めているのか分かりません。私が例として挙げたbytearrayは、x'F1F1F0F0 'の16進数のEBCDICバイト配列です。例を簡単にするために10進数で示しています。そして、codecs.decodeはそれらを同等のASCII文字列に変換します。 –

関連する問題