更改字节顺序的 Fortran 子例程

Fortran Subroutine that changes byte order

我用 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

你可以像这样包装东西

  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 字节标量传输到 1 字节标量的 4 元素数组以便使用 Fortran 的内置索引功能轻松排列。如果 srcdat 是字符变量,也更容易看出发生了什么,否则 src_arrdst_arr 在写出时通常是不存在的字符的无意义混乱。

甚至可以不用 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