-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDataEncoding.java
More file actions
97 lines (79 loc) · 2.6 KB
/
Copy pathDataEncoding.java
File metadata and controls
97 lines (79 loc) · 2.6 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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package qr;
import java.nio.charset.StandardCharsets;
import reedsolomon.ErrorCorrectionEncoding;
public final class DataEncoding {
public static boolean[] byteModeEncoding(String input, int version) {
// appel de la méthode pour créer le tableau de bytes en fonction du message et de la version
boolean[] TAB = bytesToBinaryArray(
addErrorCorrection(
fillSequence(
addInformations(
encodeString(input,QRCodeInfos.getMaxInputLength(version))),QRCodeInfos.getCodeWordsLength(version)),QRCodeInfos.getECCLength(version)));
return TAB;
}
public static int[] encodeString(String input, int maxLength) {
byte[] tab = input.getBytes(StandardCharsets.ISO_8859_1);
int length = (tab.length > maxLength) ? maxLength : tab.length;
int[] tabByte = new int[length];
for(int i=0;i<length;i++) {
byte b = tab[i];
tabByte[i] = (int)(b & 0xFF);
}
return tabByte;
}
public static int[] addInformations(int[] inputBytes) {
int[] byteCode = new int[inputBytes.length + 2];
if(inputBytes.length==0) {
byteCode[0]=64;
byteCode[1]=0;
} else {
byteCode[0]=64 + ((0b1111_0000 & (inputBytes.length)) >>4);
byteCode[1]=((0b0000_1111 & (inputBytes.length)) <<4) + ((0b1111_0000 & inputBytes[0]) >>4);
byteCode[byteCode.length - 1]=0 + ((0b0000_1111 & inputBytes[inputBytes.length -1]) << 4);
for(int i=2;i<byteCode.length - 1;i++) {
byteCode[i] = ((0b1111_0000 & inputBytes[i-1]) >> 4) + ((0b0000_1111 & inputBytes[i-2]) << 4);
}
}
return byteCode;
}
public static int[] fillSequence(int[] encodedData, int finalLength) {
int[] finalTab = new int[finalLength];
for(int i=0;i<finalLength;i++) {
if(i<encodedData.length) {
finalTab[i]=encodedData[i];
} else {
if((i-(encodedData.length))%2 == 0) {
finalTab[i]=236;
} else {
finalTab[i]=17;
}
}
}
return finalTab;
}
public static int[] addErrorCorrection(int[] encodedData, int eccLength) {
int[] newTab = new int[encodedData.length + eccLength];
int[] eccTab = new int[eccLength];
eccTab = ErrorCorrectionEncoding.encode(encodedData,eccLength);
for(int i=0;i<encodedData.length;i++) {
newTab[i]=encodedData[i];
}
for(int i=encodedData.length;i<newTab.length;i++) {
newTab[i]=eccTab[i-encodedData.length];
}
return newTab;
}
public static boolean[] bytesToBinaryArray(int[] data) {
boolean[] bitArray = new boolean[8*data.length];
for(int i=0; i<data.length;i++) {
for(int j=0; j<8; j++) {
if((((0b1111_1111 & data[i])>>(7-j))%2==0)){
bitArray[8*i + j]=false;
} else {
bitArray[8*i + j]=true;
}
}
}
return bitArray;
}
}