【问题标题】:Fortran read hexadecimal from file as ASCIIFortran 从文件中读取十六进制为 ASCII
【发布时间】:2017-04-13 08:44:12
【问题描述】:

我需要使用一个用 fortran-77 编写的旧程序。该程序以十六进制格式从文本文件中读取 10 个变量

open (2,file=filename, status='old', iostat=ios)
read (2,1) my_variables
1 format (/(10z8)) 

其中一个变量是字符串(字符*4),我想将十六进制的“414E4950”之类的东西转换为“ANIP”。 但问题是当我尝试从文件中读取数据时出现错误。

Fortran 运行时错误:整数读取期间值溢出

我该如何解决?

编辑

看来我把问题简化得太多了。 我的数据文件看起来像:

DATA_BLOCK_NAME

     3D3       1    23BE       0       0       0       0       0       0       0
       041200000414E4950       03F800000       0      16    23BF       0       0
       0       0       0       0       0       041200000414E4950       03F800000
       0      1E    23C0       0       0       0       0       0       0       0

我想将这些数据读入变量。

        read (2,1) obj_num,((var_1(j,i),j=1,7),(var_2(j,i),j=1,3),var_3(i),
 +      name(i),var_4(i),var_5(i),var_6(i),i=1,obj_num)

obj_num 为整数*4 var_1 是整数数组*4 var_2, var_3, var_4, var_5, var_6 是实数数组 但是(!)名称是字符串数组(字符* 4)

正如您在数据文件中看到的每 12 个值编码的对象名称(例如“414E4950”到“ANIP”),我想将其存储为字符串。

附言

为了修复程序,我写了一个小但很脏的修复程序。

 read (2,1) obj_num,((var_1(j,i),j=1,7),(var_2(j,i),j=1,3),var_3(i),
 +      tmp(i),var_4(i),var_5(i),var_6(i),i=1,obj_num)

  do j=1,numcn
     do i=1,4
        tmp_name( i:i ) = CHAR(MOD(tmp(j), 256))
        tmp(j) = RSHIFT(tmp(j), 8)
     end do
     ccns(j) = tmp_name
  end do

其中tmp是整数*4数组,tmp_str是字符*4 它很丑,但很有效。

【问题讨论】:

  • “一个变量是字符串”是什么意思? Z 编辑描述符用于数字类型。也许您可以展示my_variables 的真正含义,以及它/那些是如何声明的?
  • 当我解开这个陈述时(我是实验室的大三学生,不知道 fortran ;() 读取 (2, 1) 读取十个数值并尝试将其分配给列表中的变量。每个列表中的变量具有数字类型(整数*4 或浮点*8),但一个具有字符*4 类型。
  • 事情变得有点复杂,因为 Z 不在 Fortran 77 中。如果您确实有一个声称适用于 F77 编译器的程序,这可能意味着它允许对 @ 进行不同的解释987654328@。但是,在标准 Fortran 中,Z 只能用于整数、实数和复数变量的输入。变量列表必须与格式匹配:如果要读入字符变量,则必须将该变量与格式中的合适条目匹配。
  • 谢谢!所以我需要改变阅读格式,对吗?以及如何将十六进制值解码为字符串?
  • 也许您应该/可以更全面地解释您正在尝试做什么。 Fortran 可以非常轻松地从整数变量中读取和写入十六进制值。它甚至可以将整数值写入包含十六进制数字的字符串中,以便作为字符串进一步处理。但是我只是不明白您所说的 decode hexademical value to string 之类的短语是什么意思。

标签: fortran ascii


【解决方案1】:

出现错误是因为my_variables 被声明为整数,并且您的格式看起来不太正确。因此它试图从文件中读取整数,而不是十六进制。碰巧的是,读取为整数的值 414E4950 只是 Fortran 无法处理的巨大数字。因此出现错误。

我会将格式更改为1 format (10z8)。斜线表示已到达当前记录的末尾,并跳过其他所有内容,跳到新行。所以在格式规范的开头使用它看起来不太正确。

此外,要读取具有不同数据类型的 10 个变量,您应该使用例如:

read (2,1), my_string_variable, my_variables(1), my_variables(2), my_variables(3), my_variables(4), my_variables(5), my_variables(6), my_variables(7), my_variables(8), my_variables(9)

最后,您可能需要使用DATA 语句。

【讨论】:

  • 我不同意这个答案的大部分内容,但十六进制 414E4950 只是十进制 1095649616,它在有符号的 32 位整数范围内。
  • 我的意思是,由于格式不正确,它试图读取整数,而不是十六进制。因此414E4950读取为整数不在范围内。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2014-02-25
  • 2015-02-20
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多