【问题标题】:Conversion of mainframe S370 hexadecimal floating–point to decimal大型机 S370 十六进制浮点数到十进制的转换
【发布时间】:2016-02-26 05:51:21
【问题描述】:

我正在从大型机读取二进制文件,我想将当前以 HEX 表示的单进动浮点数转换为 Python 中的十进制等效值。例如

X'42808000' ==> 应该转换成十进制的 128.50.. X'C2808000' ==> 应该转换成十进制的-128.50

它们是python 中的任何内置函数吗?看起来内部浮动表示不是 IEEE 格式,而是旧的“S370 大型机十六进制格式”。请让我知道您对如何转换相同的想法。谢谢

【问题讨论】:

  • 您需要找到或弄清楚 :"old S370" 二进制格式(我怀疑它是十六进制字符),然后您可以确定将其转换为 Python 浮点数所需的操作。我确定它记录在某处。
  • 我得到了一份文档,其中显示了转换是如何完成的……但我不确定如何将其放入一段代码中。任何帮助,将不胜感激。谢谢edwardbosworth.com/My3121Textbook_HTM/MyText3121_Ch17_V02.htm(示例1和2)
  • 好的,但是直到今天早上晚些时候我才能查看它(现在几乎是凌晨 2:00)。我在链接文档中注意到我不明白的一件事。它说“回顾以 7 位无符号格式存储的整数的范围是 0 £ N £ 127,我们有 0 £ (E + 64) £ 127,或 –64 £ E £ 63。” £ 字符是什么意思,
  • 是的,它小于等于 (
  • 感谢您抽出时间马蒂诺

标签: python


【解决方案1】:

从您的问题中不清楚您说数字当前在哪里以 HEX 表示,对于 S370 十六进制浮点数的格式,无论您认为它们是二进制整数还是字符串值,所以我写了一个函数将接受任何一个。

try:
    basestring
except NameError:  # Python 3
    basestring = str

def hextofp(hexadecimal):
    """ Convert S370 hexadecimal floating-point number to Python
        binary floating point value (IEEE 754).
    """
    v = int(hexadecimal, 16) if isinstance(hexadecimal, basestring) else hexadecimal
    if v:  # not special case of "True 0"
        sign = -1 if v & 0x80000000 else 1
        exponent = ((v & 0x7f000000) >> 24) - 64  # remove bias
        fraction = float(v & 0x00ffffff) / 16777216  # divide by 2**24
        return sign * (fraction * 16**exponent)
    return 0.0

print('{:.2f}'.format(hextofp('42808000')))  # -> 128.50
print('{:.2f}'.format(hextofp(0x42808000)))  # -> 128.50
print('{:.2f}'.format(hextofp('C2808000')))  # -> -128.50
print('{:.3f}'.format(hextofp('40600000')))  # -> 0.375

# True 0
print('{:.1f}'.format(hextofp('00000000')))  # -> 0.0
# largest representable number
print('{:.8g}'.format(hextofp('7fffffff')))  # -> 7.2370051e+75
# smallest positive (normalized) number
print('{:.8g}'.format(hextofp('00100000')))  # -> 5.3976053e-79

# misc examples
print('{:.2f}'.format(hextofp('42500000')))  # -> 80.00
print('{:.2f}'.format(hextofp('41100000')))  # -> 1.00
print('{:.3f}'.format(hextofp('C276A000')))  # -> -118.625
print('{:.2f}'.format(hextofp('427b3333')))  # -> 123.20
print('{:.2f}'.format(hextofp('427b7333')))  # -> 123.45

【讨论】:

  • 太棒了...它工作得非常好...非常感谢您的帮助...我会检查您的代码,看看它是如何完成的...
猜你喜欢
  • 1970-01-01
  • 2014-03-01
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多