source: trunk/CrypPlugins/PeerToPeer/KeySearcherResult.cs @ 1458

Last change on this file since 1458 was 1458, checked in by Paul Lelgemann, 12 years ago
  • Removed unused references and using statement in CrypP2P, PeerToPeer, PeerToPeerBaseProxy

+ Skeleton for P2PEditor

File size: 4.8 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace Cryptool.Plugins.PeerToPeer.Internal
6{
7    public class KeySearcherResult
8    {
9        private const int VALUE_SIZE = 8;
10        private readonly Encoding enc;
11
12        public KeySearcherResult()
13        {
14            enc = Encoding.UTF8;
15        }
16
17        public KeySearcherResult(Encoding encType)
18        {
19            enc = encType;
20        }
21
22        /* serialization information: 3 fields per data set in the following order:
23         *  -------------------------------------------------------------------------------------------------------------------------------
24         * | Dataset count | double-value (8 byte) | string len (1 byte) | string-data (n bytes) | byte len (1 byte) | byte-data (n bytes) |
25         *  ------------------------------------------------------------------------------------------------------------------------------- */
26
27        public byte[] SerializeResult(LinkedList<KeySearcher.KeySearcher.ValueKey> resultList)
28        {
29            var queueResult = new ByteQueue();
30            //amount of list entries
31            queueResult.Push((byte) resultList.Count);
32
33            foreach (KeySearcher.KeySearcher.ValueKey valKey in resultList)
34            {
35                queueResult.Push(BitConverter.GetBytes(valKey.value));
36                queueResult.Push((byte) valKey.key.Length);
37                queueResult.Push(enc.GetBytes(valKey.key));
38                // maybe this could run into an exception, when decryption byte is longer than 256 bytes!
39                if (valKey.decryption.Length > 255)
40                {
41                    queueResult.Push(255);
42                    var shortDecrypt = new byte[255];
43                    Buffer.BlockCopy(valKey.decryption, 0, shortDecrypt, 0, 255);
44                    queueResult.Push(shortDecrypt);
45                }
46                else
47                {
48                    queueResult.Push((byte) valKey.decryption.Length);
49                    queueResult.Push(valKey.decryption);
50                }
51            }
52            return queueResult.ToArray();
53        }
54
55        public LinkedList<KeySearcher.KeySearcher.ValueKey> DeserializeResult(byte[] serializedResult)
56        {
57            var resultQueue = new ByteQueue(serializedResult);
58            var lstRet = new LinkedList<KeySearcher.KeySearcher.ValueKey>();
59
60            var valKey = new KeySearcher.KeySearcher.ValueKey();
61            int stringLen = 0;
62            int byteLen = 0;
63            int iDatasetCount = Convert.ToInt32(resultQueue.PopOneByte());
64            for (int i = 0; i < iDatasetCount; i++) //run through every data set (first byte = dataset count)
65            {
66                // 8 byte = double value
67                valKey.value = BitConverter.ToDouble(resultQueue.PopBytes(VALUE_SIZE), 0);
68                // variable string length
69                stringLen = Convert.ToInt32(resultQueue.PopOneByte());
70                valKey.key = enc.GetString(resultQueue.PopBytes(stringLen));
71                // variable byte length
72                byteLen = Convert.ToInt32(resultQueue.PopOneByte());
73                valKey.decryption = resultQueue.PopBytes(byteLen);
74
75                lstRet.AddLast(valKey);
76            }
77            return lstRet;
78        }
79
80        #region Nested type: ByteQueue
81
82        private class ByteQueue
83        {
84            private readonly Queue<byte> myQueue;
85
86            public ByteQueue()
87            {
88                myQueue = new Queue<byte>();
89            }
90
91            public ByteQueue(byte[] data)
92            {
93                myQueue = new Queue<byte>();
94                for (int i = 0; i < data.Length; i++)
95                {
96                    myQueue.Enqueue(data[i]);
97                }
98            }
99
100            public int CurrentStackSize
101            {
102                get { return myQueue.Count; }
103            }
104
105            public void Push(byte data)
106            {
107                myQueue.Enqueue(data);
108            }
109
110            public void Push(byte[] data)
111            {
112                for (int i = 0; i < data.Length; i++)
113                {
114                    myQueue.Enqueue(data[i]);
115                }
116            }
117
118            public byte PopOneByte()
119            {
120                byte ret = myQueue.Dequeue();
121                return ret;
122            }
123
124            public byte[] PopBytes(int num)
125            {
126                var ret = new byte[num];
127                for (int i = 0; i < num; i++)
128                {
129                    ret[i] = myQueue.Dequeue();
130                }
131                return ret;
132            }
133
134            public byte[] ToArray()
135            {
136                return myQueue.ToArray();
137            }
138        }
139
140        #endregion
141    }
142}
Note: See TracBrowser for help on using the repository browser.