5

我有一个小端顺序的字符串,作为十六进制编码的字符串

000000020597ba1f0cd423b2a3abb0259a54ee5f783077a4ad45fb6200000218
000000008348d1339e6797e2b15e9a3f2fb7da08768e99f02727e4227e02903e
43a42b31511553101a051f3c0000000000000080000000000000000000000000
0000000000000000000000000000000000000000000000000000000080020000

我想将每个 32 位块从 little-endian 字节交换到 big-endian 导致

020000001fba9705b223d40c25b0aba35fee549aa477307862fb45ad18020000
0000000033d14883e297679e3f9a5eb108dab72ff0998e7622e427273e90027e
312ba443105315513c1f051a0000000080000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000280

我尝试了几种方法,但还没有成功。如果有人可以展示示例实现,那就太好了。

干杯。

4

3 回答 3

6

您还可以通过以下方式使用packunpack

  • 首先解码十六进制
  • 然后在小端转换为 32 位整数
  • 用大端编码这些整数
  • 将结果编码为十六进制。

在代码中:

s = "000000020597ba1f0cd4..."
[s].pack('H*').unpack('N*').pack('V*').unpack('H*')
# => "020000001fba9705b223..."
于 2013-04-18T14:05:14.947 回答
3

除了 Łukasz Niemier 的回答之外,您还可以让我们scan一步一步处理分组:

hex_string = "000000020597ba1f..."
hex_string.scan(/(..)(..)(..)(..)/).map(&:reverse).join
# => "020000001fba9705..."
  • scan(/(..)(..)(..)(..)/)将字符串拆分为 4 x 2 字节的组:

    [["00", "00", "00", "02"], ["05", "97", "ba", "1f"], ... ]
    
  • map(&:reverse)反转内部 2 字节数组:

    [["02", "00", "00", "00"], ["1f", "ba", "97", "05"], ... ]
    
  • join连接所有数组元素

    "020000001fba9705..."
    
于 2013-04-18T10:11:47.663 回答
2

我的方法是为每 8 个字符拆分字符串:

hexes = str.scan(/.{8}/)

然后通过反转每个 2 个字符将它们映射到更改字节序:

big = hexes.map { |hex| hex.scan(/.{2}/).reverse.join('') }

然后把他们一起加入

str = big.join('')

撬会话示例:

[23] pry(main)> str
=> "000000020597ba1f0cd423b2a3abb0259a54ee5f783077a4ad45fb6200000218000000008348d1339e6797e2b15e9a3f2fb7da08768e99f02727e4227e02903e43a42b31511553101a051f3c00000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000"
[24] pry(main)> str.scan(/.{8}/).map { |s| s.scan(/.{2}/).reverse.join('') }.join('')
=> "020000001fba9705b223d40c25b0aba35fee549aa477307862fb45ad180200000000000033d14883e297679e3f9a5eb108dab72ff0998e7622e427273e90027e312ba443105315513c1f051a00000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280"

或改进@Stefan 的回答:

hex_string.scan(/(..){4}/).msp(&:reverse).join('') # remember that anybody can change $, variable

于 2013-04-18T08:50:06.043 回答