Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2019
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.33 KB | None | 0 0
  1. using System.Collections.Generic;
  2.  
  3. internal class SLIP {
  4. private const byte SLIP_EOF = 0xC0;
  5. private const byte SLIP_ESC = 0xDB;
  6. private const byte SLIP_ESC_EOF = 0xDC;
  7. private const byte SLIP_ESC_ESC = 0xDD;
  8.  
  9. internal class Frame {
  10. public byte[] Data { get; private set; }
  11.  
  12. public Frame(byte[] data)
  13. {
  14. Data = data;
  15. }
  16. }
  17.  
  18. private List<byte> _pending = new List<byte>();
  19. private bool _escaped = false;
  20. private bool _valid = true;
  21. private readonly object _sync = new object();
  22.  
  23. public List<Frame> Consume(byte[] data)
  24. {
  25. lock (_sync) {
  26. var frames = new List<Frame>();
  27.  
  28. foreach (var value in data) {
  29. if (_escaped) {
  30. switch (value) {
  31. case SLIP_ESC_EOF: {
  32. _pending.Add(SLIP_EOF);
  33. break;
  34. }
  35. case SLIP_ESC_ESC: {
  36. _pending.Add(SLIP_ESC);
  37. break;
  38. }
  39. default: {
  40. _valid = false;
  41. _pending.Clear();
  42. break;
  43. }
  44. }
  45.  
  46. _escaped = false;
  47. } else {
  48. switch (value) {
  49. case SLIP_EOF: {
  50. if (_valid) {
  51. var frame = _pending;
  52. frames.Add(new Frame(frame.ToArray()));
  53. }
  54. _pending = new List<byte>();
  55. _valid = true;
  56. break;
  57. }
  58. case SLIP_ESC: {
  59. _escaped = true;
  60. break;
  61. }
  62. default: {
  63. if (_valid) {
  64. _pending.Add(value);
  65. }
  66. break;
  67. }
  68. }
  69. }
  70. }
  71.  
  72. return frames;
  73. }
  74. }
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement