需要将 1 和 0 的字符串作为二进制表示形式转换为十进制数
Need to convert string of 1s and 0s as a binary representation into a decimal number
我正在创建一个子网划分程序并且已经能够将八位字节转换为串联的二进制表示,但我面临的问题是该表示是字符串格式:
IO.inspect(binary_subnet_address)
"11000000101010001100100000100000"
这是二进制的子网地址,但如何将其改回每个八位组的 8 位分组并将其转换回十进制数?
我找到了这个 但它没有指定如何将二进制数改回十进制数,老实说我不确定如何将字符串转换为 8 项的列表,因为它是。
看起来你只想在每个部分使用 String.to_integer/2
和基数 2,对吗?
iex> for offset <- 0..3 do
...> "11000000101010001100100000100000"
...> |> binary_part(offset * 8, 8)
...> |> String.to_integer(2)
...> end
[192, 168, 200, 32]
因为你的字符串:
"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]
have been able to convert the octets to a concatenated binary representation
你应该post你开始的时候,然后我们可以告诉你如何省去你可能做过的所有不必要的事情。
另一个(更快的)选项是使用 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]
上面的内容可能会用宏缩短,但我认为这里不值得。
我正在创建一个子网划分程序并且已经能够将八位字节转换为串联的二进制表示,但我面临的问题是该表示是字符串格式:
IO.inspect(binary_subnet_address)
"11000000101010001100100000100000"
这是二进制的子网地址,但如何将其改回每个八位组的 8 位分组并将其转换回十进制数?
我找到了这个
看起来你只想在每个部分使用 String.to_integer/2
和基数 2,对吗?
iex> for offset <- 0..3 do
...> "11000000101010001100100000100000"
...> |> binary_part(offset * 8, 8)
...> |> String.to_integer(2)
...> end
[192, 168, 200, 32]
因为你的字符串:
"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]
have been able to convert the octets to a concatenated binary representation
你应该post你开始的时候,然后我们可以告诉你如何省去你可能做过的所有不必要的事情。
另一个(更快的)选项是使用 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]
上面的内容可能会用宏缩短,但我认为这里不值得。