使用 base64 对 Ruby 哈希进行编码

Encode a Ruby hash using base64

尝试使用 base64 对哈希进行编码,但我无法获得预期的 base64 字符串。

json = {
  "v": "2",
  "ps": "法国",
  "add": "fr.sangyu.tw",
  "port": "443",
  "id": "ce14d788-0f79-491e-85ca-05240612f28a",
  "aid": "233",
  "net": "ws",
  "type": "none",
  "host": "fr.sangyu.tw",
  "path": "/",
  "tls": "tls"
}

Base64.encode64 JSON.dump(json)

预期字符串:

ew0KICAidiI6ICIyIiwNCiAgInBzIjogIuazleWbvSIsDQogICJhZGQiOiAiZnIuc2FuZ3l1LnR3IiwNCiAgInBvcnQiOiAiNDQzIiwNCiAgImlkIjogImNlMTRkNzg4LTBmNzktNDkxZS04NWNhLTA1MjQwNjEyZjI4YSIsDQogICJhaWQiOiAiMjMzIiwNCiAgIm5ldCI6ICJ3cyIsDQogICJ0eXBlIjogIm5vbmUiLA0KICAiaG9zdCI6ICJmci5zYW5neXUudHciLA0KICAicGF0aCI6ICIvIiwNCiAgInRscyI6ICJ0bHMiDQp9

我的(不正确的)字符串:

eyJ2IjoiMiIsInBzIjoi5rOV5Zu9IiwiYWRkIjoiZnIuc2FuZ3l1LnR3Iiwi cG9ydCI6IjQ0MyIsImlkIjoiY2UxNGQ3ODgtMGY3OS00OTFlLTg1Y2EtMDUy NDA2MTJmMjhhIiwiYWlkIjoiMjMzIiwibmV0Ijoid3MiLCJ0eXBlIjoibm9u ZSIsImhvc3QiOiJmci5zYW5neXUudHciLCJwYXRoIjoiLyIsInRscyI6InRs cyJ9

我看到了问题 How to encode a hash using Ruby Base64 module 但它对我不起作用。

你做对了。有几个原因导致您没有获得预期的输出。

JSON.dump(json) 生成以下内容(无格式):

{"v":"2","ps":"","add":"fr.sangyu.tw","port":"443","id":"ce14d788-0f79-491e-85ca-05240612f28a","aid":"233","net":"ws","type":"none","host":"fr.sangyu.tw","path":"/","tls":"tls"}

您可能想使用 JSON.pretty_generate(json) 产生:

{
  "v": "2",
  "ps": "",
  "add": "fr.sangyu.tw",
  "port": "443",
  "id": "ce14d788-0f79-491e-85ca-05240612f28a",
  "aid": "233",
  "net": "ws",
  "type": "none",
  "host": "fr.sangyu.tw",
  "path": "/",
  "tls": "tls"
}

最后,我不知道你在哪个 OS 或者你是如何得到你最初预期的 base64,但它们可能有不同的行尾 \n\r\n,这可能会导致不同的 base64.

您可以使用-

Base64.strict_encode64(JSON.pretty_generate(json))

它生成的base64字符串和你期望的不一样

ewogICJ2IjogIjIiLAogICJwcyI6ICLms5Xlm70iLAogICJhZGQiOiAiZnIuc2FuZ3l1LnR3IiwKICAicG9ydCI6ICI0NDMiLAogICJpZCI6ICJjZTE0ZDc4OC0wZjc5LTQ5MWUtODVjYS0wNTI0MDYxMmYyOGEiLAogICJhaWQiOiAiMjMzIiwKICAibmV0IjogIndzIiwKICAidHlwZSI6ICJub25lIiwKICAiaG9zdCI6ICJmci5zYW5neXUudHciLAogICJwYXRoIjogIi8iLAogICJ0bHMiOiAidGxzIgp9

但是生成的内容是一样的

我还尝试在 https://www.base64encode.org/ 中对您的 json 进行编码,这会生成与上述答案相同的字符串。