如何在Ruby中将数据转换为大端格式

5

我有一个以小端序表示的字符串,是十六进制编码的字符串。

000000020597ba1f0cd423b2a3abb0259a54ee5f783077a4ad45fb6200000218
000000008348d1339e6797e2b15e9a3f2fb7da08768e99f02727e4227e02903e
43a42b31511553101a051f3c0000000000000080000000000000000000000000
0000000000000000000000000000000000000000000000000000000080020000

我希望将每个32位块从小端转换为大端,结果为

020000001fba9705b223d40c25b0aba35fee549aa477307862fb45ad18020000
0000000033d14883e297679e3f9a5eb108dab72ff0998e7622e427273e90027e
312ba443105315513c1f051a0000000080000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000280

我尝试了几种方法,但都没有成功。如果有人能展示一个样例实现的话,那就太好了。

谢谢。

3个回答

7
你也可以通过以下方式使用packunpack
  • 首先解码十六进制
  • 然后将其转换为小端的32位整数
  • 使用大端对这些整数进行编码
  • 将结果以十六进制编码。
代码如下:
s = "000000020597ba1f0cd4..."
[s].pack('H*').unpack('N*').pack('V*').unpack('H*')
# => "020000001fba9705b223..."

3
除了Łukasz Niemier的答案外,您还可以让scan一步处理分组:
hex_string = "000000020597ba1f..."
hex_string.scan(/(..)(..)(..)(..)/).map(&:reverse).join
# => "020000001fba9705..."
  • scan(/(..)(..)(..)(..)/) splits the string into groups of 4 x 2 bytes:

    [["00", "00", "00", "02"], ["05", "97", "ba", "1f"], ... ]
    
  • map(&:reverse) reverses the inner 2-byte arrays:

    [["02", "00", "00", "00"], ["1f", "ba", "97", "05"], ... ]
    
  • join joins all array elements

    "020000001fba9705..."
    

甚至更好的是 /(..){4}/ - Hauleth
我明白了。在我看来这是一个bug,但我会在回去后检查一下。 - Hauleth

2

我的方法是将字符串每8个字符分为一组:

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

然后将它们映射到每2个字符反转一次的方式来改变字节序:

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

然后将它们全部组合在一起

str = big.join('')

Pry 会话示例:

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

Or improving @Stefan's answer:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接