2016-11-18 190 views
0

我有一個函數應該接收EBCDIC格式的數據並將其轉換爲ASCII。Python和ebcdic解碼(zos 1047)

例如,轉換數據,F1F1F0F0應該給我一個1100的ASCII碼,或者31313030的十六進制ASCII碼。

什麼我發現是這樣的:

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是transfroming我的數據「AAAA」在這種情況下,這是不正確。 (tmp is correct bytearray(b'F1F1F0F0'))

任何想法,還是應該爲EBCDIC製作我自己的字典?

回答

0

在上面的代碼中的錯誤是,輸入應該被視爲十六進制(感謝凱文指出)。

改正的代碼:

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'的字節表示。

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

你正在通過什麼,從一個EBCDIC點,毫無意義:EBCDIC 48,49和70是不確定的,所以codecs.decode是要給無意義的輸出。

我不知道你在哪裏,從獲取輸入,但如果你想要一個EBCDIC字符串轉換成ASCII碼,你可以這樣做:

>>> 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

你是對有關的ByteArray,那是我不好,但有使用上EBCDIC的十六進制cidecs.decode,或如何轉換HEX EBCDIC以不同的方式到bytearray? – Bogdan

+0

我不知道你在問什麼。我把在作爲例子的ByteArray是HEX EBCDIC字節數組,x'F1F1F0F0' 的,我只是把它們作爲十進制數爲便於舉例。 codecs.decode將它們轉換爲等效的ASCII字符串。 –