-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHamming_encoded_block.cpp
More file actions
91 lines (62 loc) · 1.47 KB
/
Copy pathHamming_encoded_block.cpp
File metadata and controls
91 lines (62 loc) · 1.47 KB
1
2
3
4
5
6
7
8
9
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <vector>
#include <cstdint>
#include <stdexcept>
#include <cmath>
#include <istream>
#include <ostream>
#include "stuff.h"
#include "BitBuffer.h"
#include "Matrix.h"
#include "Hamming_encoded_block.h"
#include <iostream>
Hamming_encoded_block::Hamming_encoded_block(){
G = {{
{1, 0, 0, 0, 1, 0, 1},
{0, 1, 0, 0, 1, 1, 1},
{0, 0, 1, 0, 1, 1, 0},
{0, 0, 0, 1, 0, 1, 1}
}};
H = {{
{1, 0, 1},
{1, 1, 1},
{1, 1, 0},
{0, 1, 1},
{1, 0, 0},
{0, 1, 0},
{0, 0, 1}
}};
}
BitBuffer Hamming_encoded_block::encode(const BitBuffer &data){
vector<int64_t> infoWord = cast<uint8_t, int64_t>(data.getUncompressedData());
vector<int64_t> codeWord = infoWord * G;
BitBuffer result;
for(auto bit : codeWord)
result.insertBit(bit);
return result;
}
BitBuffer Hamming_encoded_block::decode(const BitBuffer &data){
vector<int64_t> codeWord = cast<uint8_t, int64_t>(data.getUncompressedData());
vector<int64_t> syndrome = codeWord * H;
Matrix syndroms = {{
{1, 0, 1},
{1, 1, 1},
{1, 1, 0},
{0, 1, 1},
{1, 0, 0},
{0, 1, 0},
{0, 0, 1}
}};
errorPos = syndroms.findRow(syndrome);
if(errorPos >= 0 && errorPos <= 3)
codeWord.at(errorPos) = (codeWord.at(errorPos) == 1) ? 0 : 1;
codeWord.resize(infoWordSize);//обрезаем энтропию
BitBuffer result;
for(auto bit : codeWord)
result.insertBit(bit);
return result;
}
int64_t Hamming_encoded_block::getLastError(){
uint64_t res = errorPos;
errorPos = 0;
return res;
}