Binary 在fortran中编写原始二进制无符号32位整数

Binary 在fortran中编写原始二进制无符号32位整数,binary,fortran,uint32,Binary,Fortran,Uint32,我有一个四字节的整数,我想把它转换成一个无符号的32位整数,然后作为原始二进制数据(小尾端)写入。根据此模式,此值将用作要在paraview中读取的.vtu文件中的偏移量 我已经尝试过ZEXT和IAND函数,但没有成功,可能是因为我对C语言和C-fortran接口的了解非常基础。 下面是我尝试做的一个草稿 use ISO_C_BINDING ... INTEGER(kind=4), dimension(8):: offset=0 ... OPEN(newunit=vtu, action='wri

我有一个四字节的整数,我想把它转换成一个无符号的32位整数,然后作为原始二进制数据(小尾端)写入。根据此模式,此值将用作要在paraview中读取的.vtu文件中的偏移量 我已经尝试过ZEXT和IAND函数,但没有成功,可能是因为我对C语言和C-fortran接口的了解非常基础。 下面是我尝试做的一个草稿

use ISO_C_BINDING
...
INTEGER(kind=4), dimension(8):: offset=0
...
OPEN(newunit=vtu, action='write', access='stream', STATUS='new', form='unformatted', FILE=filename)
....
WRITE(vtu)char(95),ZEXT(offset(1),C_INT32_T),...
WRITE(vtu)ZEXT(offset(2),C_INT32_T),...
...
--编辑(2020年5月1日)

子例程打印\u vtu\u二进制\u
使用声明
使用iso_fortran_env
隐式无
整数(种类=int32)::i,vtu,打印号=0
整数(种类=int32),维度(6)::偏移
字符(len=24)::文件夹
如果(步骤==0),则
调用新文件夹(文件夹)
如果结束
偏移量(1)=0
偏移量(2)=偏移量(1)+4+SIZEOF(前面的位置)
偏移量(3)=偏移量(2)+4+SIZEOF(前向速度)
偏移量(4)=偏移量(3)+4+尺寸(半径)
偏移量(5)=偏移量(4)+4
偏移量(6)=偏移量(5)+4
!或
!偏移量(1)=0
!偏移量(2)=偏移量(1)+4+8*粒子数*3!(双精度*无粒子*无组件)
!偏移量(3)=偏移量(2)+4+8*粒子数*3
!偏移量(4)=偏移量(3)+4+8*粒子数
!偏移量(5)=偏移量(4)+4
!偏移量(6)=偏移量(5)+4
打开(newunit=vtu,action='write',access='stream',STATUS='new',form='unformatted',FILE='.//'.//'.//'//文件夹//'/'//'//'//修剪(系统名称)//itoa(打印编号)//'.vtu')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
WRITE(vtu)'//新行('A')
写入(vtu)字符(95),偏移量(1),前置位置
写入(vtu)偏移量(2),前置速度
写入(vtu)偏移量(3),半径
写入(vtu)偏移量(4)、偏移量(5)、偏移量(6)
!另一种写作方式
!写入(vtu)字符(95),偏移量(1),(前面的位置,i=1,粒子数)
!写入(vtu)偏移量(2),(前置速度,i=1,粒子数)
!写入(vtu)偏移量(3),(半径,i=1,粒子数)
!写入(vtu)偏移量(4)、偏移量(5)、偏移量(6)
!另一种不同的方式
!写入(vtu)字符(95),偏移量(1),(前_位置(i,1),前_位置(i,2),前_位置(i,3),i=1,_粒子数)
!写入(vtu)偏移量(2),(前置速度(i,1),前置速度(i,2),前置速度(i,3),i=1,粒子数)
!写入(vtu)偏移量(3),(半径,i=1,粒子数)
!写入(vtu)偏移量(4)、偏移量(5)、偏移量(6)
写(vtu)新行('A')/“”//新行('A'))
写入(vtu)'
关闭(单位=vtu)
打印号码=打印号码+1
结束子例程打印\u vtu\u二进制\u追加
谢谢弗拉基米尔F的回答。但是,我仍然收到此错误消息:

错误:在C:\bbd\ecd338f\build\superbuild\paraview\src\VTK\IO\XML\vtkxmlnunstructureddatareader.cxx第466行 vtkXMLUnstructuredGridReader(00000244BF849310):无法从工件0中的点读取点数组。元素中的数据数组可能太短


我认为问题在于我写偏移量的方式(换句话说,Paraview无法识别有符号整数)。我测试了三种编写方法和两种计算偏移量的方法(如代码中所示)。我不知道出了什么问题。我做了一个类似的子例程来打印一个.vtu ASCII文件和一个.vtk二进制文件,我在这两个方面都取得了成功。

Fortran整数是有符号的。但是,正整数在有符号和无符号中是相同的。所以,如果你的数字是正数,就没有理由使用任何函数。如果您有一个未格式化的流文件,并且您想要写入一个四字节整数,那么您只需这样做

use iso_fortran_inv
INTEGER(kind=int32):: number

open(newunit=vtu, action='write', access='stream', STATUS='new', form='unformatted', FILE=filename)

WRITE(vtu) number
就这些。如果您的数字足够小,则不涉及任何转换函数

如果您的数字大于最大有符号32位值,这实际上取决于在此之前您在Fortran中所做的操作。你如何实际使用这个数字

  • 如果它是一个负的32位整数,并且您希望将其写为无符号-同样,不涉及任何转换。只需写入已签名的数字,Paraview就会将其读取为未签名

  • 如果您的Fortran代码使用较大的整数类型在Fortran中将数字表示为正数,则必须进行转换。在这种情况下,您需要复制位模式,这最好使用
    transfer()
    函数或使用旧的
    等效函数来完成

这里是一个转换示例。我只是强调,只有当您使用更大的整数类型将完整值表示为正值(即Fortran为正值)时,才有必要:

输出为(在little endian机器上):



不要使用
int(kind=4)
,它不是可移植的

欢迎使用,不要使用javascript快照按钮格式化代码,使用代码按钮。Fortran不知道无符号整数,即使考虑到C的互操作性,那么,将四字节整数转换为32位无符号整数时,您要做什么呢?您确实需要查看您创建的文件,以明确它的错误。这将使您能够更好地调整程序以写入将被接受的输出。我查看了该文件,并将其与paraview从正确的.vtu ascii文件生成的二进制文件进行了比较。但是,我仍然无法识别错误。请不要共享有关外部资源的任何重要信息。1.没有人知道那里会有什么样的病毒。2.它不会停留在那里,弗雷弗,这个问题将失去意义。谢谢
use iso_fortran_inv
INTEGER(kind=int32):: number

open(newunit=vtu, action='write', access='stream', STATUS='new', form='unformatted', FILE=filename)

WRITE(vtu) number
 use iso_fortran_env
 integer(int64) :: large
 integer(int32) :: unsigned
 integer(int32) :: tmp(2)    

 large = 3000000000_int64
 print '(z0)', large

 tmp = transfer(large, tmp)     
 unsigned = tmp(1)

 print '(z0)', unsigned
end
> ./a.out 
B2D05E00
B2D05E00