Python 和 ebcdic 解码 (zos 1047)
Python and ebcdic decoding (zos 1047)
我有一个函数可以接收十六进制 EBCDIC 格式的数据并将其转换为 ASCII。
例如,转换数据,F1F1F0F0 应该给我一个 ASCII 的 1100,或十六进制 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 正在转换我在“ããã”中的数据,在这种情况下这是不正确的。 (tmp 是正确的 bytearray(b'F1F1F0F0'))
有什么想法,或者我应该为 EBCDIC 制作自己的字典吗?
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'
上述代码中的错误是输入应被视为 HEX(感谢 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_
我有一个函数可以接收十六进制 EBCDIC 格式的数据并将其转换为 ASCII。
例如,转换数据,F1F1F0F0 应该给我一个 ASCII 的 1100,或十六进制 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 正在转换我在“ããã”中的数据,在这种情况下这是不正确的。 (tmp 是正确的 bytearray(b'F1F1F0F0'))
有什么想法,或者我应该为 EBCDIC 制作自己的字典吗?
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'
上述代码中的错误是输入应被视为 HEX(感谢 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_