Elixir:Base64 解码 TTN 消息
Elixir: Base64 decode TTN message
objective:
我正在从物联网中获取 base64 编码的原始负载。我试图在我的服务器上解码它,而不是使用他们的 javascript 有效载荷解码器。
十六进制编码的消息是:AWYQkQCsCPMANA==
什么有效:
我平时的解码是这样的:
def decode(string) do
string = String.upcase(string)
# get the first 2 bytes, which is 4 hex characters
{flagsbat, string} = String.split_at(string, 4)
parse(Base.decode16!(flagsbat), string)
end
以及实际解码器的函数头:
defp parse(<<a::1, b::1, _reserve::1, c::1, d::1, e::1, f::1, g::1, bat>>, <<data::binary>>) do
这部分对于 "01660dfa0109038d0030"
这样的字符串工作正常。但是不知何故,当 TTN 向我发送 Base64 编码的原始有效载荷时,一切都失败了。
什么不起作用:
我正在尝试调用函数 Base.decode64!(raw_payload) |> decode()
它给了我错误:** (ArgumentError) non-alphabet digit found: "\x01" (byte 1)
有趣的是,我发现如果我 Base.decode64!("AWYQkQCsCPMANA==")
,我得到 <<1, 102, 16, 145, 0, 172, 8, 243, 0, 52>>
,而 https://cryptii.com/pipes/base64-to-hex returns 我 01 66 10 91 00 ac 08 f3 00 34
。为什么?
编辑:
说清楚:
{flagsbat, string} = "AWYQkQCsCPMANA==" |> Base.decode64!() |> String.upcase() |> String.split_at(4)
Base.decode16!(flagsbat) # this throws the error
{flagsbat, string} = "0166109100ac08f30034" |> String.upcase() |> String.split_at(4)
Base.decode16!(flagsbat) # works
那么如何从 base64 编码的原始负载中获取可以拆分和解析的字符串?
“0166109100ac08f30034”是我在 https://cryptii.com/pipes/base64-to-hex
上对“AWYQkQCsCPMANA==”进行 Base64 解码时得到的结果
原来我需要对解码后的 Base64 进行 Base16 编码以获得实际的字符串。
Base.decode64!("AWYQkQCsCPMANA==") |> Base.encode16() |> decode()
这确实有技巧,我可以将它正常传递到解码函数中。
objective:
我正在从物联网中获取 base64 编码的原始负载。我试图在我的服务器上解码它,而不是使用他们的 javascript 有效载荷解码器。
十六进制编码的消息是:AWYQkQCsCPMANA==
什么有效:
我平时的解码是这样的:
def decode(string) do
string = String.upcase(string)
# get the first 2 bytes, which is 4 hex characters
{flagsbat, string} = String.split_at(string, 4)
parse(Base.decode16!(flagsbat), string)
end
以及实际解码器的函数头:
defp parse(<<a::1, b::1, _reserve::1, c::1, d::1, e::1, f::1, g::1, bat>>, <<data::binary>>) do
这部分对于 "01660dfa0109038d0030"
这样的字符串工作正常。但是不知何故,当 TTN 向我发送 Base64 编码的原始有效载荷时,一切都失败了。
什么不起作用:
我正在尝试调用函数 Base.decode64!(raw_payload) |> decode()
它给了我错误:** (ArgumentError) non-alphabet digit found: "\x01" (byte 1)
有趣的是,我发现如果我 Base.decode64!("AWYQkQCsCPMANA==")
,我得到 <<1, 102, 16, 145, 0, 172, 8, 243, 0, 52>>
,而 https://cryptii.com/pipes/base64-to-hex returns 我 01 66 10 91 00 ac 08 f3 00 34
。为什么?
编辑: 说清楚:
{flagsbat, string} = "AWYQkQCsCPMANA==" |> Base.decode64!() |> String.upcase() |> String.split_at(4)
Base.decode16!(flagsbat) # this throws the error
{flagsbat, string} = "0166109100ac08f30034" |> String.upcase() |> String.split_at(4)
Base.decode16!(flagsbat) # works
那么如何从 base64 编码的原始负载中获取可以拆分和解析的字符串?
“0166109100ac08f30034”是我在 https://cryptii.com/pipes/base64-to-hex
上对“AWYQkQCsCPMANA==”进行 Base64 解码时得到的结果原来我需要对解码后的 Base64 进行 Base16 编码以获得实际的字符串。
Base.decode64!("AWYQkQCsCPMANA==") |> Base.encode16() |> decode()
这确实有技巧,我可以将它正常传递到解码函数中。