【问题标题】:url_decode64 binary serialization to stringurl_decode64 二进制序列化为字符串
【发布时间】:2015-09-01 22:51:23
【问题描述】:

我目前正在尝试从 Youtube 评论中解码一些 base64 CDATA。它似乎将其解码为二进制罚款,但不确定如何将其转换为字符串。

<?xml version="1.0" encoding="utf-8"?><root><comments><![CDATA[EAEYACCQTg==]]></comments></root>

在灵药中

iex> Base.url_decode64!("EAEYACCQTg==")    
<<16, 1, 24, 0, 32, 144, 78>>

如果我尝试将它折腾成 utf8 字符串,它不匹配。

iex> <<x::utf8>> = Base.url_decode64!("EAEYACCQTg==")
** (MatchError) no match of right hand side value: <<16, 1, 24, 0, 32, 144, 78>>

【问题讨论】:

  • Elixir 中的字符串二进制文件,所以这里不需要转换。例如,&lt;&lt;65, 66, 67&gt;&gt;"ABC" 完全相同,这只是 Elixir 为您漂亮地打印出来的问题。当二进制文件只包含有效的代码点时,它将被打印为字符串,否则它将被打印为“原始”二进制文件。关键是:您解码的字节不是有效的字符串,例如字符串不能包含0 字节。这里可能涉及另一个级别的编码。你碰巧知道结果应该是什么样子吗?
  • 我认为这是我的问题,它不是真正的字符串表示。我试图直接从他们的网站解码它,而不是通过 API。不确定数据的实际编码是什么。
  • 你知道预期的输出是什么吗?这将使找出解码的必要步骤变得更加容易。
  • 这种表示是当没有新的 cmets 存在时。我在想象它会是 JSON 还是 BSON 表示? pastebin.com/Q7qUpM3f 是一个更大的例子,展示了多个新的 cmets。当我在 python 中解析它时,结果如下:pastebin.com/9jhEtqpw
  • 是的,看起来像是某种二进制序列化格式。我听说 Google 在某些地方使用 Protobuf,但我没有这方面的经验。

标签: elixir


【解决方案1】:

我认为您使用的编码值是问题所在:

iex(1)> Base.url_decode64!("EAEYACCQTg==") |> String.valid?
false
iex(2)> <<104, 101, 197, 130, 197, 130, 111>> |> String.valid?
true
iex(3)> IO.puts "The string is #{<<104, 101, 197, 130, 197, 130, 111>>}"
The string is hełło
:ok

如果解码后的字符串是有效的,你会得到一个开箱即用的字符串作为返回值:

iex(4)> Base.encode64("foobar")
"Zm9vYmFy"
iex(5)> Base.url_decode64!("Zm9vYmFy")
"foobar"

【讨论】:

    【解决方案2】:

    您的匹配模式是针对单个 utf-8 字符,而不是字符串,但是虽然没有针对任意长度的 utf-8 字符串的匹配模式,但您可以使用该模式逐个字符递归地解析结果二进制字符以提取一个 utf-8 字符串。

    【讨论】:

    • 感谢 Bitwalker。总是一个很好的帮助。这很有帮助,没想到一次只能获得 1 位。
    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    相关资源
    最近更新 更多