My approach is to split the line for every 8 characters:
hexes = str.scan(/.{8}/)
then match them to change endiannes by changing all 2 characters:
big = hexes.map { |hex| hex.scan(/.{2}/).reverse.join('') }
and then attach them all together
str = big.join('')
Example pry session:
[23] pry(main)> str => "000000020597ba1f0cd423b2a3abb0259a54ee5f783077a4ad45fb6200000218000000008348d1339e6797e2b15e9a3f2fb7da08768e99f02727e4227e02903e43a42b31511553101a051f3c00000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000" [24] pry(main)> str.scan(/.{8}/).map { |s| s.scan(/.{2}/).reverse.join('') }.join('') => "020000001fba9705b223d40c25b0aba35fee549aa477307862fb45ad180200000000000033d14883e297679e3f9a5eb108dab72ff0998e7622e427273e90027e312ba443105315513c1f051a00000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280"
Or an improvement on @ Stefan's answer:
hex_string.scan(/(..){4}/).msp(&:reverse).join('')
Strike>
source share