【问题标题】:Need to convert string of 1s and 0s as a binary representation into a decimal number需要将作为二进制表示的 1 和 0 的字符串转换为十进制数
【发布时间】:2019-12-03 15:09:50
【问题描述】:

我正在创建一个子网划分程序,并且已经能够将八位字节转换为串联的二进制表示,但我面临的问题是表示是字符串格式:

IO.inspect(binary_subnet_address)
"11000000101010001100100000100000"

这是二进制的子网地址,但是如何将其更改回每个八位组的 8 位分组并将其转换回十进制数?

我找到了这个answer,但它没有指定如何将二进制改回十进制数,老实说,我不确定如何将字符串转换为包含 8 个项目的列表。

【问题讨论】:

    标签: erlang elixir


    【解决方案1】:

    因为你的字符串:

    “11000000101010001100100000100000”

    仅包含 ASCII 字符,每个字符为一个字节长。这允许您使用 bitstring comprehension 从字符串中一次提取 8 个字符(= 8 个字节):

    defmodule A do
    
      def split(str) do
        for <<chunk::binary-size(8) <- str>> do 
          String.to_integer(chunk, 2)
        end
      end
    
    end
    

    在 iex 中:

    iex(13)> c "a.ex"                                    
    warning: redefining module A (current version defined in memory)
      a.ex:1
    
    [A]
    
    iex(14)> A.split "11000000101010001100100000100000"
    [192, 168, 200, 32]
    

    已经能够将八位字节转换为串联的二进制表示

    您应该发布您开始的内容,然后我们可以向您展示如何免除您可能做过的所有不必要的事情。

    【讨论】:

    • 完整的代码非常笨拙,多年来我一直在尝试用不同的语言构建这个程序,而 Elixir 是第一个让我很接近的程序!所以我在这里用非常大的蜡笔画画,但任何建议都将不胜感激。最终目标是把它作为一个凤凰网站来直观地教授子网,所以我需要发回一个结构:github.com/roostercrab/subnetter
    【解决方案2】:

    您似乎只想在每个部分上使用以 2 为底的 String.to_integer/2,对吧?

    iex> for offset <- 0..3 do
    ...>   "11000000101010001100100000100000"
    ...>   |> binary_part(offset * 8, 8)
    ...>   |> String.to_integer(2)
    ...> end
    [192, 168, 200, 32]
    

    【讨论】:

    • 非常感谢,我只是碰巧使用了 7stud 的代码,所以我接受了他的回答,因为它将进入代码库。但我很欣赏 Elixir 如何提供两种方法来处理原始二进制文件!如果您感到无聊并想帮助收紧代码,请点击此处:github.com/roostercrab/subnetter
    • 我实际上是用 Integer.to_string 转换的,我什至没有想到只是将两者颠倒过来。 Elixir 太合乎逻辑了!
    • 是的,我更喜欢他的回答。我在位串理解方面没有太多经验。
    • 偏移在你的代码中做了什么?我原以为我们会使用 0..7,因为我们想要 8 个块,但您的结果就像它们是 8 位数字一样。
    • 啊等等,我看到了,它做了 4 次。极好的。 :)
    【解决方案3】:

    另一个(更快)选项是使用Bitwise 进行直接位访问,根本不需要调用String.to_integer(2)

    import Bitwise
    
    input = "11000000101010001100100000100000"
    
    for << <<b7, b6, b5, b4, b3, b2, b1, b0>> <- input>>,
      do: ((b7 - ?0) <<< 7) +
          ((b6 - ?0) <<< 6) +
          ((b5 - ?0) <<< 5) +
          ((b4 - ?0) <<< 4) +
          ((b3 - ?0) <<< 3) +
          ((b2 - ?0) <<< 2) +
          ((b1 - ?0) <<< 1) +
          ((b0 - ?0) <<< 0)
    #⇒ [192, 168, 200, 32]
    

    上面的内容可以用宏来缩短,但我认为这里不值得。

    【讨论】:

      猜你喜欢
      • 2013-11-24
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 2011-08-03
      相关资源
      最近更新 更多