Binary 删除Erlang中二进制文件中的尾随0

Binary 删除Erlang中二进制文件中的尾随0,binary,erlang,trim,strip,Binary,Erlang,Trim,Strip,我目前正在用Erlang编写一个函数,它需要没有尾随零的二进制文件。由于实现和其他输入,将返回的内容将有尾随的零 换言之,我将拥有以下内容: 和 对于上述内容,我需要获得: 和 需要保留结尾处连续零之前的零 如果有人能给出解决方案,我们将不胜感激。谢谢大家! 简单而直接的方法是: 1> Binary = <<3,1,0,2,4,5,0,0,2,3,4,0,0,0,0,0>>. <<3,1,0,2,4,5,0,0,2,3,4,0,0,0,0,0>&g

我目前正在用Erlang编写一个函数,它需要没有尾随零的二进制文件。由于实现和其他输入,将返回的内容将有尾随的零

换言之,我将拥有以下内容:

对于上述内容,我需要获得:

需要保留结尾处连续零之前的零


如果有人能给出解决方案,我们将不胜感激。谢谢大家!

简单而直接的方法是:

1> Binary = <<3,1,0,2,4,5,0,0,2,3,4,0,0,0,0,0>>.
<<3,1,0,2,4,5,0,0,2,3,4,0,0,0,0,0>>
2> list_to_binary(lists:reverse(lists:dropwhile(fun(0) -> true; (_) -> false end, lists:reverse(binary_to_list(Binary))))).
<<3,1,0,2,4,5,0,0,2,3,4>>
1>二进制=。
2> 列表到二进制(列表:反向(列表:dropwhile(fun(0)->true;(\u)->false结束,列表:反向(二进制到列表(二进制‘‘)’))。

我建议您使用真实的数据对其进行分析,看看它是否适合您。

简单而直接的方法如下:

1> Binary = <<3,1,0,2,4,5,0,0,2,3,4,0,0,0,0,0>>.
<<3,1,0,2,4,5,0,0,2,3,4,0,0,0,0,0>>
2> list_to_binary(lists:reverse(lists:dropwhile(fun(0) -> true; (_) -> false end, lists:reverse(binary_to_list(Binary))))).
<<3,1,0,2,4,5,0,0,2,3,4>>
1>二进制=。
2> 列表到二进制(列表:反向(列表:dropwhile(fun(0)->true;(\u)->false结束,列表:反向(二进制到列表(二进制‘‘)’))。

我建议用真实的数据来分析它,看看它是否对你有用。

在评论中注意到@caluga的类似解决方案之前,我先整理了一个解决方案。这个可以处理空二进制文件或全零

strip(B) ->
  strip(B, erlang:byte_size(B) - 1).

strip(_B, -1) ->
  <<>>;
strip(B, Idx) ->
  case binary:at(B, Idx) of
    0 -> strip(B, Idx - 1);
    _ -> binary:part(B, 0, Idx + 1)
  end.


1> demo:strip(<<>>).
<<>>
2> demo:strip(<<0>>).
<<>>
3> demo:strip(<<0,0>>).
<<>>
4> demo:strip(<<1,2>>).
<<1,2>>
5> demo:strip(<<1,0,2>>).
<<1,0,2>>
6> demo:strip(<<1,0,2,0>>).
<<1,0,2>>
7> demo:strip(<<1,0,2,0,0>>).
<<1,0,2>>
strip(B)->
strip(B,erlang:byte_size(B)-1)。
条带(_B,-1)->
;
带(B,Idx)->
大小写二进制:的(B,Idx)处
0->strip(B,Idx-1);
_->二进制:部分(B,0,Idx+1)
结束。
1> 演示:strip()。
2> 演示:strip()。
3> 演示:strip()。
4> 演示:strip()。
5> 演示:strip()。
6> 演示:strip()。
7> 演示:strip()。

我在评论中注意到@caluga的类似解决方案之前,将其组合在一起。这个可以处理空二进制文件或全零

strip(B) ->
  strip(B, erlang:byte_size(B) - 1).

strip(_B, -1) ->
  <<>>;
strip(B, Idx) ->
  case binary:at(B, Idx) of
    0 -> strip(B, Idx - 1);
    _ -> binary:part(B, 0, Idx + 1)
  end.


1> demo:strip(<<>>).
<<>>
2> demo:strip(<<0>>).
<<>>
3> demo:strip(<<0,0>>).
<<>>
4> demo:strip(<<1,2>>).
<<1,2>>
5> demo:strip(<<1,0,2>>).
<<1,0,2>>
6> demo:strip(<<1,0,2,0>>).
<<1,0,2>>
7> demo:strip(<<1,0,2,0,0>>).
<<1,0,2>>
strip(B)->
strip(B,erlang:byte_size(B)-1)。
条带(_B,-1)->
;
带(B,Idx)->
大小写二进制:的(B,Idx)处
0->strip(B,Idx-1);
_->二进制:部分(B,0,Idx+1)
结束。
1> 演示:strip()。
2> 演示:strip()。
3> 演示:strip()。
4> 演示:strip()。
5> 演示:strip()。
6> 演示:strip()。
7> 演示:strip()。

您可以使用以下简单功能:

-module(strip).

-export([trailing0/1]).

trailing0(B) when is_binary(B) ->
    S = byte_size(B) - 1,
    case B of
        <<Prefix:S/bytes, 0>> -> trailing0(Prefix);
        _ -> B
    end;
trailing0(B) -> error(badarg, [B]).
-模块(条带)。
-导出([trailing0/1])。
trailing0(B)何时为二进制(B)->
S=字节大小(B)-1,
案件B
->trailing0(前缀);
_->B
结束;
trailing0(B)->错误(badarg[B])。
如果您希望使用长后缀,可以使用:

trailing0(B) when is_binary(B) ->
    S = byte_size(B) - 1,
    S2 = S - 7,
    case B of
        <<Prefix:S2/bytes, 0:64>> -> trailing0(Prefix);
        <<Prefix:S/bytes, 0>> -> trailing0(Prefix);
        _ -> B
    end;
trailing0(B) -> error(badarg, [B]).
trailing0(B)何时为二进制(B)->
S=字节大小(B)-1,
S2=S-7,
案件B
->trailing0(前缀);
->trailing0(前缀);
_->B
结束;
trailing0(B)->错误(badarg[B])。

您可以使用以下简单功能:

-module(strip).

-export([trailing0/1]).

trailing0(B) when is_binary(B) ->
    S = byte_size(B) - 1,
    case B of
        <<Prefix:S/bytes, 0>> -> trailing0(Prefix);
        _ -> B
    end;
trailing0(B) -> error(badarg, [B]).
-模块(条带)。
-导出([trailing0/1])。
trailing0(B)何时为二进制(B)->
S=字节大小(B)-1,
案件B
->trailing0(前缀);
_->B
结束;
trailing0(B)->错误(badarg[B])。
如果您希望使用长后缀,可以使用:

trailing0(B) when is_binary(B) ->
    S = byte_size(B) - 1,
    S2 = S - 7,
    case B of
        <<Prefix:S2/bytes, 0:64>> -> trailing0(Prefix);
        <<Prefix:S/bytes, 0>> -> trailing0(Prefix);
        _ -> B
    end;
trailing0(B) -> error(badarg, [B]).
trailing0(B)何时为二进制(B)->
S=字节大小(B)-1,
S2=S-7,
案件B
->trailing0(前缀);
->trailing0(前缀);
_->B
结束;
trailing0(B)->错误(badarg[B])。

另外,我意识到我也可以使用这个:trim(A)->case binary:at(A,byte_size(A)-1)==0的true->trim(binary:part(A,{0,byte_size(A)-1});错误->结束。这意味着不需要转换为列表和返回。无论如何,所有问题都解决了,谢谢!这是真的,但是你的方式也会做很多不必要的操作,并产生很多必须清理的垃圾。只要您处理的二进制文件很小,并且没有太多的尾随0,您就可以了,但在将其放入实际系统之前,您仍然需要使用实际数据分析这两种方法。顺便说一句,您的方法在空二进制文件或包含所有0的二进制文件上也会失败。此外,我意识到我也可以使用:trim(A)->case binary:at(A,byte_size(A)-1)=0 of true->trim(binary:part(A,{0,byte_size(A)-1});错误->结束。这意味着不需要转换为列表和返回。无论如何,所有问题都解决了,谢谢!这是真的,但是你的方式也会做很多不必要的操作,并产生很多必须清理的垃圾。只要您处理的二进制文件很小,并且没有太多的尾随0,您就可以了,但在将其放入实际系统之前,您仍然需要使用实际数据分析这两种方法。顺便说一句,对于空二进制文件或包含所有0的二进制文件,您的方法也会失败。