% 编写一个函数来反转某个二进制型里的字节顺序
-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]).