【问题标题】:Python and ebcdic decoding (zos 1047)Python 和 ebcdic 解码 (zos 1047)
【发布时间】:2016-11-18 12:43:13
【问题描述】:

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

例如,转换数据,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 正在转换我在“ãããã”中的数据,在这种情况下这是不正确的。 (tmp 是正确的 bytearray(b'F1F1F0F0'))

有什么想法,或者我应该为 EBCDIC 制作自己的字典吗?

【问题讨论】:

    标签: python python-3.x zos ebcdic


    【解决方案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'
    

    【讨论】:

    • 来自wiki,查看表格(例如EBCDIC代码页00037)en.wikipedia.org/wiki/EBCDIC_037我得到的字符串是Row F + column 1 = F1 => 1的表示
    • 你对 bytearray 是对的,那是我的错,但是有没有不同的方式在 EBCDIC 的十六进制上使用 cidecs.decode,或者如何将 HEX ebcdic 转换为 bytearray?
    • 我不确定你在问什么。我作为示例放入的 bytearray 是一个 HEX EBCDIC 字节数组,x'F1F1F0F0',为了便于示例,我只是将它们作为十进制数字放入。 codecs.decode 将它们转换为等效的 ASCII 字符串。
    • 这是我的错误,因为在更改对 bytearray.fromhex(data).decode('cp500') 的调用后,我将输入视为非 HEX(数据),所有工作都像魅力一样 :) 谢谢!
    【解决方案2】:

    上述代码中的错误是输入应该被视为 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_
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 2021-08-15
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      相关资源
      最近更新 更多