【问题标题】:How do i read a byte bit by bit with little endianness我如何一点一点地读取一个字节
【发布时间】:2018-03-14 17:55:47
【问题描述】:

我正在尝试逐位读取一个字节,但我发现位的顺序要颠倒。有人建议我,当我应该使用小字节序阅读时,我可能读错了(大字节序)。

序列是1101 0110

如果我只是对每个位进行模式匹配,我会得到提到的顺序,但所需的顺序是 0110 1101

我尝试像这样用little-size(1) 添加模式匹配

<<
  test1::little-size(1),
  test2::little-size(1),
  test3::little-size(1),
  test4::little-size(1),
  test5::little-size(1),
  test6::little-size(1),
  test7::little-size(1),
  test8::little-size(1),
>> = byte

但我仍然得到相同的位顺序,我需要制作一个反转它们的函数吗?还是它被融入 Elixir 中,而我只是做错了?

【问题讨论】:

  • 所以你想每 4 位反转一次?还是在所需的顺序中有错字?字节序是指大型二进制文件中完整字节的顺序,而不是字节内的位(或 4 位)。
  • 嘿@Dogbert,我想切换每个字节的两个半字节。这可能会对此有所了解stackoverflow.com/questions/49254886/…“这些组中的每一个都只是简单地颠倒了。那是因为人类可读的表示是大端的,当您读取索引 0 处的位时,这是最右边的。所以如果您正在阅读它们从流中逐位读取,从右到左读取每个字节。”
  • 字节序是字节级别的。二进制字节 01101101 在序列 76543210 中具有 2 的幂。因此已经存在反转。通常 bit[0] 会首先发送:“little endian”。 对于交换半字节,顺序无关紧要。

标签: binary elixir


【解决方案1】:

回答评论中的实际问题:

我想切换每个字节的两个半字节。

iex(1)> binary = <<0b11010110, 0b11010110>>
<<214, 214>>
iex(2)> for << <<a::4, b::4>> <- binary >>, into: <<>>, do: <<b::4, a::4>>
"mm"
iex(3)> <<0b01101101, 0b01101101>>
"mm"

我们在这里使用二进制理解来一次提取二进制的两个半字节,然后我们切换它们的顺序并将其插入到一个新的二进制中。

【讨论】:

    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多