首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析LIFX报头返回错误的协议号

解析LIFX报头返回错误的协议号
EN

Stack Overflow用户
提问于 2016-06-05 05:09:08
回答 1查看 90关注 0票数 5

我正试图按照他们的文件解析LIFX。

下面是我的代码:

代码语言:javascript
复制
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。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-05 13:33:36

我不是这方面的专家,但我有一个理论,当你取12位而不是16位的时候,endianess的工作方式并不像你所期望的那样。这个解决方案只是我在玩弄数字,因为我发现它是一个有趣的问题。也许有一个更好的解决方案,我还没有深入研究erlang实现。

如果我们忽略了所有其他数据,那么我们就有了以下内容:

代码语言:javascript
复制
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

因为这是小endian,所以如果我们交换两个字节,就会得到:

代码语言:javascript
复制
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

因此,一个解决办法是:

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37638670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档