《Erlang 程序设计》练习答案 -- 第七章 二进制型与位语法

% 编写一个函数来反转某个二进制型里的字节顺序

-module(reverse_byte).
-export([reverse_byte/1]).

% 注释为将对象先转化为二进制,然后进行反转。
%reverse_byte(Obj) ->
%    reverse_byte(term_to_binary(Obj), <<>>,1).

reverse_byte(Bin) ->
    reverse_byte(Bin, <<>>, 1).

reverse_byte(Bin, RetBin, Pos) when Pos =< byte_size(Bin) ->
    {Bin1, Bin2} = split_binary(Bin, Pos),
    reverse_byte(Bin2, list_to_binary([Bin1, RetBin]),Pos);
reverse_byte(Bin, RetBin, Pos) when Pos > byte_size(Bin) ->
    RetBin.

这里写图片描述


题目要求类似网络编程中的封装包过程,我理解错误写成拆包了,而且是 4 Byte 不是 4 bits,已经改正,谢谢下面那位朋友哈。

% (2).编写一个 term_to_packet(Term) -> Packet 的函数,
% 通过调用 term_to_binary(Term) 来生成并返回一个二进制型,
% 它内含长度为 4 个字节的包头 N,后跟 N 个字节的数据

-module(termtopacket).
-export([term_to_packet/1]).

term_to_packet(Term) ->
    Bin = term_to_binary(Term),
    % 提取出前 4 Byte,作为后面info的大小
    % 注意,一定要位数匹配,否则会报错。
    <<Head:32/bits, _/bits>> = Bin,
    <<Size:32>> = Head,
    <<Head:32/bits, Info:Size/bits>> = Bin,
    Info.

% 也可以这样写
term_to_packet(Term) ->
    Bin = term_to_binary(Term),
    <<Head:32, Info/bitstring>> = Bin,
    Info.

改正版本

% 编写一个 term_to_packet(Term) -> Packet 的函数,
% 通过调用 term_to_binary(Term) 来生成并返回一个二进制型,
% 它内含长度为 4 个字节的包头 N,后跟 N 个字节的数据

-module(termtopacket).
-export([term_to_packet/1]).

term_to_packet(Term) ->
    Bin = term_to_binary(Term),
    Length = bit_size(Bin),
    Size = <<Length:1/unit:32>>,
    <<Size/binary, Bin/binary>>.

运行如图:

还有一种最简单的方式:

Size = 1000.
Len = <<Size:32>>.

这样就用 4 byte 来表示长度了:)


% (3).编写一个反转函数 packet_to_term(Packet) -> Term,
% 使它成为前一个函数的逆向函数

-module(packettoterm).
-export([packet_to_term/1]).

packet_to_term(Packet) ->
    <<Head:4/bits, _/bits>> = Packet,
    <<Size:4>> = Head,
    <<Head:4/bits, Info:Size/bits>> = Packet,
    binary_to_term(Info).

% (5).编写一个函数来反转某个二进制型所包含的位。

-module(reversebinary).
-export([reverse_binary/1]).

reverse_binary(B) ->
    lists:reverse([X || <<X:1>> <= B]).
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值