如何将 Base64 编码的字符串转换为 UUID 格式
How to convert a Base64 encoded string to UUID format
如何将 Base64 编码的字符串转换为带有破折号的十六进制编码的字符串(基本上是 uuid 格式)?
例如,如果我有
'FWLalpF2T5mmyxS03Q+hNQ0K'
那我怎样才能把它转换成:
1562da96-9176-4f99-a6cb-14b4dd0fa135
我熟悉 unpack
但这促使我学习了 cremno 指出的指令。
最简单的形式:
b64 = 'FWLalpF2T5mmyxS03Q+hNQ0K'
b64.unpack("m0").first.unpack("H8H4H4H4H12").join('-')
#=> "1562da96-9176-4f99-a6cb-14b4dd0fa135"
b64.unpack("m0")
给我们:
#=> ["\x15b\xDA\x96\x91vO\x99\xA6\xCB\x14\xB4\xDD\x0F\xA15\r\n"]
这是一个数组,所以我们使用 .first
获取字符串并使用指令再次解压缩以将其格式化为 8-4-4-4-12 格式:
b64.unpack("m0").first.unpack("H8H4H4H4H12")
给我们:
#=> ["1562da96", "9176", "4f99", "a6cb", "14b4dd0fa135"]
一个字符串数组,所以现在我们只需将它与 -
:
连接起来
b64.unpack("m0").first.unpack("H8H4H4H4H12").join('-')
#=> "1562da96-9176-4f99-a6cb-14b4dd0fa135"
糟糕
接受的答案有缺陷:
b64 = 'FWLalpF2T5mmyxS03Q+hNQ0K'
b64.unpack("m0").first.unpack("H8H4H4H4H12").join('-')
# => "1562da96-9176-4f99-a6cb-14b4dd0fa135"
更改 b64 字符串中的最后一个字符会导致相同的 UUID:
b64 = 'FWLalpF2T5mmyxS03Q+hNQ0L'
b64.unpack("m0").first.unpack("H8H4H4H4H12").join('-')
# => "1562da96-9176-4f99-a6cb-14b4dd0fa135"
为防止这种情况发生,您可能需要将输入(base64 或其他任何东西)散列到正确的长度,例如MD5:
require "digest"
b64 = 'FWLalpF2T5mmyxS03Q+hNQ0K'
Digest::MD5.hexdigest(b64).unpack("a8a4a4a4a12").join('-')
# => "df71c785-6552-a977-e0ac-8edb8fd63f6f"
现在完整的输入是相关的,更改最后一个字符会导致不同的 UUID:
require "digest"
b64 = 'FWLalpF2T5mmyxS03Q+hNQ0L'
Digest::MD5.hexdigest(s).unpack("a8a4a4a4a12").join('-')
# => "2625f170-d05a-f65d-38ff-5d9a7a972382"
如何将 Base64 编码的字符串转换为带有破折号的十六进制编码的字符串(基本上是 uuid 格式)?
例如,如果我有
'FWLalpF2T5mmyxS03Q+hNQ0K'
那我怎样才能把它转换成:
1562da96-9176-4f99-a6cb-14b4dd0fa135
我熟悉 unpack
但这促使我学习了 cremno 指出的指令。
最简单的形式:
b64 = 'FWLalpF2T5mmyxS03Q+hNQ0K'
b64.unpack("m0").first.unpack("H8H4H4H4H12").join('-')
#=> "1562da96-9176-4f99-a6cb-14b4dd0fa135"
b64.unpack("m0")
给我们:
#=> ["\x15b\xDA\x96\x91vO\x99\xA6\xCB\x14\xB4\xDD\x0F\xA15\r\n"]
这是一个数组,所以我们使用 .first
获取字符串并使用指令再次解压缩以将其格式化为 8-4-4-4-12 格式:
b64.unpack("m0").first.unpack("H8H4H4H4H12")
给我们:
#=> ["1562da96", "9176", "4f99", "a6cb", "14b4dd0fa135"]
一个字符串数组,所以现在我们只需将它与 -
:
b64.unpack("m0").first.unpack("H8H4H4H4H12").join('-')
#=> "1562da96-9176-4f99-a6cb-14b4dd0fa135"
糟糕
接受的答案有缺陷:
b64 = 'FWLalpF2T5mmyxS03Q+hNQ0K'
b64.unpack("m0").first.unpack("H8H4H4H4H12").join('-')
# => "1562da96-9176-4f99-a6cb-14b4dd0fa135"
更改 b64 字符串中的最后一个字符会导致相同的 UUID:
b64 = 'FWLalpF2T5mmyxS03Q+hNQ0L'
b64.unpack("m0").first.unpack("H8H4H4H4H12").join('-')
# => "1562da96-9176-4f99-a6cb-14b4dd0fa135"
为防止这种情况发生,您可能需要将输入(base64 或其他任何东西)散列到正确的长度,例如MD5:
require "digest"
b64 = 'FWLalpF2T5mmyxS03Q+hNQ0K'
Digest::MD5.hexdigest(b64).unpack("a8a4a4a4a12").join('-')
# => "df71c785-6552-a977-e0ac-8edb8fd63f6f"
现在完整的输入是相关的,更改最后一个字符会导致不同的 UUID:
require "digest"
b64 = 'FWLalpF2T5mmyxS03Q+hNQ0L'
Digest::MD5.hexdigest(s).unpack("a8a4a4a4a12").join('-')
# => "2625f170-d05a-f65d-38ff-5d9a7a972382"