大型机 S370 十六进制浮点数到十进制的转换
Posted
技术标签:
【中文标题】大型机 S370 十六进制浮点数到十进制的转换【英文标题】:Conversion of mainframe S370 hexadecimal floating–point to decimal 【发布时间】: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。” £ 字符是什么意思, 是的,它小于等于 ( 感谢您抽出时间马蒂诺 【参考方案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
【讨论】:
太棒了...它工作得非常好...非常感谢您的帮助...我会检查您的代码,看看它是如何完成的...以上是关于大型机 S370 十六进制浮点数到十进制的转换的主要内容,如果未能解决你的问题,请参考以下文章