Elixir 编写适用于位字符串或列表的库

Elixir 编写适用于位字符串或列表的库,elixir,Elixir,我正在从事一个涉及大量字节级操作的项目。我希望库能够接受二进制文件作为输入,但使用Enum上的函数通常很方便。我最终得到了很多函数,它们有两个受保护的定义,一个用于when is_binary,另一个用于when is_list: @doc”“” 将二进制或字节列表转换为十六进制字符串表示形式, ##例子 iex>Bytes.to_hex “010203fdfeff” iex>Bytes.to_hex[1,2,3255] “010203fdfeff” """ def到_十六进制(字节)何时是_二

我正在从事一个涉及大量字节级操作的项目。我希望库能够接受二进制文件作为输入,但使用
Enum
上的函数通常很方便。我最终得到了很多函数,它们有两个受保护的定义,一个用于
when is_binary
,另一个用于
when is_list

@doc”“”
将二进制或字节列表转换为十六进制字符串表示形式,
##例子
iex>Bytes.to_hex
“010203fdfeff”
iex>Bytes.to_hex[1,2,3255]
“010203fdfeff”
"""
def到_十六进制(字节)何时是_二进制(字节)do
:binary.bin_to_list(bytes)|>to_hex |>:binary.list_to_bin
结束
def到_十六进制(字节)何时为_列表(字节)do
hexes=Enum.map字节,&byte_to_hex/1
Enum.join(hexes)|>String.downcase |>:binary.bin_to_列表
结束
defp字节\到\十六进制(字节)do
整数到字符列表(字节,16)->:字符串右(2,?0)
结束
此外,在列表版本的末尾有
:binary.bin_to_list
,然后在字符串版本的末尾有
:binary.list_to_bin
,这导致了多余的工作

我真的希望能够对二进制文件使用相同的抽象。我最初尝试通过实现
位字符串的协议来实现这一点:

dempl可枚举,用于:位字符串do
def计数(coll)do
{:好的,字节大小(coll)}
结束
def成员?(_coll,_val)do
{:错误,{u}
结束
def reduce({:halt,acc},{u fun)do
{:暂停,acc}
结束
def reduce(bin,{:suspend,acc},fun)do
{:暂停,acc和reduce(bin和1,fun)}
结束
def reduce(,{:cont,acc},_-fun)do
{:完成,acc}
结束
def reduce(>,{:cont,acc},fun)do
减少(t,乐趣。(h,acc,乐趣)
结束
结束
这对于
计数
成员
减少
情况非常有效:

test“counts bytes”do
断言Enum.count()==3
结束
测试“报告成员”的行为
断言枚举成员?(,)==false
断言枚举成员?(,)==true
结束
测试“减少二进制文件”吗
减速器=fn(b,acc)->b acc端
断言Enum.reduce(“abc”,“reducer)==“cba”
结束
但是,一些
Enum
函数调用
上的函数:list
;例如,
Enum.map
调用
:lists.reverse
,因此这会提供不同的输出:

测试“映射二进制文件”是否
映射器=fn()->结束
断言枚举映射(,映射器)=
结束
1)测试映射二进制文件
带有==的断言失败
代码:Enum.map(,mapper)=
lhs:[,]
rhs:
处理这种情况最惯用的方法是什么?我应该简单地与警卫保持联系并实现列表二进制转换吗?我是否应该为函数创建一个特定的模块,比如
List
is to
Enum

编辑

我想我可以通过将二进制作为基本情况来处理额外的列表二进制转换:

def to_hex(字节)何时是_binary(字节)do
字节
|>:binary.bin\u到\u列表
|>枚举映射(&byte_to_hex/1)
|>枚举连接
结束
def到_十六进制(字节)何时为_列表(字节)do
字节数|>:binary.list_to_bin |>to_hex |>:binary.bin_to_list
结束
defp字节\到\十六进制(字节)do
整数.to_string(字节,16)|>string.rjust(2,?0)|>string.downcase
结束

但是当然,在这个版本中,仍然有相同数量的
list\u to\u bin
bin\u to\u list
调用,只是移动了一下。没有办法解决这个问题吗?

在枚举二进制文件的同时得到二进制文件看起来很奇怪。对我来说,它们应该是整数。就像一个字符列表


然后像
Enum.map
这样的函数将按预期工作。

在枚举二进制文件时得到二进制文件看起来很奇怪。对我来说,它们应该是整数。就像一个字符列表


然后像
Enum.map
这样的函数将按预期工作。

您发布了lib吗?@Sheharyar我正在研究Matasano加密挑战。代码很旧,但在这里:你发布了你的库吗?@Sheharyar我正在研究Matasano密码挑战。代码很旧,但在这里:你发布了你的库吗?@Sheharyar我正在研究Matasano密码挑战。代码很旧,但如下所示: