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