Куча говна / Говнокод #8385 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 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.

Пишу модуль для работы с веб-сокетами на Эрланге. Эта функция парсит и декодирует пакет, присылаемый клиентом.
Функцию я уже переписал.

Запостил: rasufa rasufa, (Updated )

Комментарии (6) RSS

  • У макконнелла помню была описана похожая задача. Он предлагал структуру пакетов (состав и тип полей) хранить в таблице, ключом к которой является тип пакета. И парсинг значительно упрощается... Не знаю, правда, насколько это применимо к Эрлангу.
    Ответить
  • по моему этому коду просто нехватает структурности.

    никогда не понимал народ который пытается все свалить в одну функцию.

    оба кэйса и тру ветка ифа должны отлично выделяться в отдельные функции.
    Ответить
  • т"M:A?E:M)T P?BK$YT)H)G.D"E.ON.V,L(R M$V!R?G.Q?A,Q!C)C)Q(P?B,V)P!T.T)W,K)M,G"X T:I"G.Y$O.Y.X F"FN"R(M!J:N$L!S(X!C?E:H M)F!ML,V,Z)D:T G?O"F!L D U(L!Z"V"I(X.M.DM A U:W.B$G.W,M"S)I"J ZA U BB"D:M.ZG"V:V!P:T!U,S?N$D N.D?LU!N:G"I!K"C:XO.K H C I!M,K:I:B(U:U$D)H,M)H,L?O"R"L?M:O D.L$G!H$P$E?WX$I"S:N)B!CY!GB:J.R)S(M,QI?Q$E:A:P!Y.R)WU)J"CC?C!H:Z.M.D.Z,A P P.N,I D!K!Z"U.S!I!E:X(N)D.E.F(X?G,W K(B"Q?Z?V I)X:K"B.O(I(E)Z.N.U.O:K)B(F(C.O,V.G!W(XQ,R)A"R,W.Z.Q.Q:O!L)V T Q!C:D!Z(K?V$DF T:S:M:B.Y A.D,F.Y$K:B$Z PK(S,W"Z,K?Y.L,G O)F:E"R:B"N,D"K,R!D,L M W G W"H(HC,G,G G J(L?LНSKMNAGCBQJKAJBQMJKWEXTIQTAVECOKFVHCFNZJMYUKWPVIVGCNDKWMPQESIECUTZNVCSNBLJSRJTJAMKCUTFERDETHUSWZNREOGWCIPWZTLEXSYPKWWYXBYANYZEHTAMMVTXYXSVCAWOTVUTQONVTKLKVWKJUWNGAOPKDWKYTTQCODVJHRAAFKGORPETNKHKJBFKCXIWWVCMLFBTIASUPGRIBLYJQXWNSJSXYYQKNZKSNBFNAWOKXZDEBEZDDGFELFTJJX
    Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8