首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python和ebcdic解码(zos 1047)

Python和ebcdic解码(zos 1047)
EN

Stack Overflow用户
提问于 2016-11-18 12:43:13
回答 2查看 2.3K关注 0票数 0

我有一个函数,应该接收十六进制EBCDIC格式的数据,并将其转换为ASCII。

例如,转换数据,F1F1F0F0应该给我1100年的ASCII,或31313030的十六进制ASCII。

我发现的是:

代码语言:javascript
复制
    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是正确的字节数组(b‘F1F1F0F0’))

有什么想法,还是我应该为EBCDIC制作自己的字典?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-21 09:18:03

以上代码中的错误是输入应该被视为HEX (感谢Kevin指出的)。

修正后的代码:

代码语言:javascript
复制
    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_
票数 0
EN

Stack Overflow用户

发布于 2016-11-19 00:28:52

字节数组(b‘F1F1F0F0’)不是您认为的那样。它是ASCII字符串F1F1F0F0的字节表示形式。

代码语言:javascript
复制
>>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,可以这样做:

代码语言:javascript
复制
>>> input=bytearray([241, 241, 240, 240])
>>> for item in input: print(item)
241
241
240
240
>>> import codecs
>>> codecs.decode(input, 'cp500')
'1100'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40677454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档