我想知道如何在Elixir中使用十六进制字符串。具体而言,我有兴趣将Hex转换为ASCII。如何用Elixir打包/解压十六进制字符串(高位半字节)
在Ruby中,这种实现可能是:
["001C7F616A8B002128C1A33E8100"].pack('H*').gsub(/[^[:print:]]/, '.')
我将如何实现与灵药这项任务?我曾尝试过:
<<00, 01, C7, F6...>>
但这不是字符串的十六进制的正确表示形式。感谢您的时间和协助!
所以我取得了一些进展,但我目前正在努力与此递归方面。
这是我的解决方案迄今:
defmodule ElixirNetworkTools do
def decode(payload) do
upper_payload = String.upcase payload
case Base.decode16(upper_payload) do
:error -> decode_with_nonprintable_characters(payload)
{:ok, decoded_payload} -> decoded_payload
end
|> IO.write
end
def decode_with_nonprintable_characters(payload) do
String.chunk(payload, ~r/\w{2}/)
|> Enum.each(fn(byte) ->
case Base.decode16(byte) do
:error -> '.'
{:ok, decoded_payload} -> decoded_payload
end
end)
end
end
感谢这个解决方案!看到你解决问题的方法真的很有帮助。可悲的是,虽然我无法使用它,因为我正在致力于构建一个十六进制有效负载检查器,所以需要替换它,所以我可能/可能需要将字符显示为一个句点。有了这个说法,这对于看到另一种处理方法非常有帮助,而不需要明确的检查,而是通过模式匹配解决方案。谢谢!现在在https://howistart.org/posts/elixir/1 – kkirsche
做你的教程很高兴帮助!我已经添加了一个关于如何用点替换非ascii的例子。 –