更改字节顺序的Fortran子例程

时间:2015-05-05 19:13:05

标签: fortran

我在Fortran中编写了一个例程来执行反向字节顺序。这相当于src="1234"; dst="4321"。我想将例程更改为使用变量srcdst指定的任意排序来设置排序位置。

这是反向字节排序的代码。

Subroutine byteorder (src, dst, x, y)

Real, Intent (out) :: y
Character (Len=*), Intent (in) :: src, dst 
Real, Intent (in)  :: x

Integer :: i, j

i = Transfer (x, 0)
Call Mvbits (i, 24, 8, j,  0 )
Call Mvbits (i, 16, 8, j,  8 )
Call Mvbits (i,  8, 8, j, 16 )
Call Mvbits (i,  0, 8, j, 24 )
y = Transfer (j, 0.0)

End Subroutine byteorder

2 个答案:

答案 0 :(得分:2)

你可以包装这样的东西

  CHARACTER(len=4) :: src, dst
  CHARACTER(len=1), DIMENSION(4) :: src_arr, dst_arr
  INTEGER, DIMENSION(4) :: permutation

  permutation = [2,4,3,1]

  src_arr = TRANSFER(src,src_arr)
  dst_arr = src_arr(permutation)
  dst = TRANSFER(dst_arr,dst)

进入子程序。

够快吗?你决定了。

编辑:我对srcdst的字符变量的使用似乎引起了一些混淆。如果srcdst是实数或整数,那么该方法也同样适用:

  REAL :: src, dst

请注意确保字符数组与srcdst中的字节数具有相同数量的1字节元素。我已经使用了字符作为中间表示,因为这些映射是1:1的字节(在几乎所有你可能遇到的计算机上)我已经将一个4字节的标量转移到4字节的1字节标量数组来制作使用Fortran的内置索引功能很容易进行置换。如果srcdat是字符变量,也可以更容易地看到正在发生的事情,否则src_arrdst_arr在写出时通常是无意义的不存在的字符。

答案 1 :(得分:0)

甚至可以在没有transfer的情况下执行此操作:

program test
  implicit none
  character(len=*),parameter  :: src = '1234'
  integer,parameter           :: perm(4) = [2,4,3,1]
  character(len=len(src))     :: dst
  integer                     :: i

  do i=1,len(src)
    dst(i:i) = src(perm(i):perm(i))
  enddo
  print *,src,'->',dst
end program