gpt4 book ai didi

elixir - 解析 LIFX header 返回错误的协议(protocol)号

转载 作者:行者123 更新时间:2023-12-04 20:35:00 27 4
gpt4 key购买 nike

我正在尝试按照 their documentation 解析 LIFX header .

这是我的代码:

data = <<36, 0, 0, 52, 33, 235, 176, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0>>
<< size :: little-integer-size(16),
origin :: little-integer-size(2),
tagged :: size(1),
addressable :: size(1),
protocol :: little-integer-size(12),
rest :: bitstring >> = data
IO.puts protocol

这告诉我 protocol1027 ,但 LIFX 的文档说它应该是 1024。我已经通过使用 LIFX's RubyGem 进行了确认。该字段的值为 1024。

为什么在 Elixir 中我看到的值是 1027,而不是 1024?

最佳答案

我不是这方面的专家,但我有一个理论认为,当您使用 12 位而不是 16 位时,字节序并没有按照您所期望的方式工作。这个解决方案只是我在玩弄数字,因为我发现它很有趣问题。可能有更好的解决方案,我还没有深入研究 erlang 的实现。

如果我们忽略所有其他数据,那么我们有这个:

data = <<0, 52>>

# data is equal to 0000 0000 0011 0100
# oota pppp pppp pppp

<< origin :: little-integer-size(2),
tagged :: size(1),
addressable :: size(1),
protocol :: little-integer-size(12) >> = data

IO.puts protocol # 1027
IO.puts origin # 0
IO.puts tagged # 0
IO.puts addressable # 0

# doing little-endiain on 12 bits = 0100 0000 0011
# pppp pppp pppp

由于这是 little-endian,如果我们轮换两个字节,我们得到:
data = <<52, 0>>

# data is equal to 0011 0100 0000 0000
# oota pppp pppp pppp

<< origin :: integer-size(2),
tagged :: size(1),
addressable :: size(1),
protocol :: integer-size(12) >> = data

IO.puts protocol # 1024
IO.puts origin # 0
IO.puts tagged # 1
IO.puts addressable # 1

所以一种解决方案是:
data = <<0, 52>>
<< p1 :: integer-size(4),
p2 :: integer-size(4),
<< origin :: size(2), tagged :: size(1), addressable :: size(1) >>,
p3 :: integer-size(4) >> = data

IO.inspect p1 # 0
IO.inspect p2 # 0
IO.inspect p3 # 4
<< protocol :: size(12) >> = <<p3 :: size(4), p2 :: size(4), p1 :: size(4)>>
IO.puts protocol # 1024
IO.puts origin # 0
IO.puts tagged # 1
IO.puts addressable # 1

关于elixir - 解析 LIFX header 返回错误的协议(protocol)号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37638670/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com