- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
parse(Data) ->
io:format("~p~n", [Data]),
<<A:8, B:8, C/binary>> = Data,
FinalMark = case (bit_nth(0, A)) of 1 -> true; 0 -> false end,
MaskMark = case (bit_nth(0, B)) of 1 -> true; 0 -> false end,
Result1 = [{final, FinalMark}, {masked, MaskMark}],
Opcode = case <<A:4>> of
<<16#0:4>> -> continuation_frame;
<<16#1:4>> -> text_frame;
<<16#2:4>> -> binary_frame;
<<16#8:4>> -> connection_closed;
<<16#9:4>> -> ping;
<<16#a:4>> -> pong;
<<_:4>> -> unknown
end,
Result2 = Result1 ++ [{opcode, Opcode}],
<<LengthSign:7>> = <<B:7>>,
Length = if
LengthSign =< 125 ->
C1 = C,
LengthSign;
LengthSign == 126 ->
<<L0:16, C1/binary>> = C, L0;
LengthSign == 127 ->
<<L0:64, C1/binary>> = C, L0
end,
Result3 = Result2 ++ [{length, Length}],
case MaskMark of
true ->
<<MaskingKey0:8, MaskingKey1:8, MaskingKey2:8, MaskingKey3:8, C2/binary>> = C1,
MaskingKey = [MaskingKey0, MaskingKey1, MaskingKey2, MaskingKey3],
Result4 = Result3 ++ [{masking_key, MaskingKey}],
Payload = binary_to_list(C2),
TX = decode(Payload, lists:reverse(MaskingKey), 0, []);
false -> C2 = C1, Result4 = Result3,
Payload = binary_to_list(C2), TX = Payload
end,
Result = Result4 ++ [{msg, TX}],
Result.
Пишу модуль для работы с веб-сокетами на Эрланге. Эта функция парсит и декодирует пакет, присылаемый клиентом.
Функцию я уже переписал.
roman-kashitsyn 01.11.2011 16:59 # 0
TheHamstertamer 01.11.2011 19:59 # +3
bot-minurast 01.11.2011 21:02 # +1
Dummy00001 02.11.2011 01:43 # 0
никогда не понимал народ который пытается все свалить в одну функцию.
оба кэйса и тру ветка ифа должны отлично выделяться в отдельные функции.
jabber 23.11.2011 00:49 # 0
guest8 09.04.2019 11:52 # −999