File Export
-
@faz808 Yes this looks spot on. We don't normally encourage external links but when it is to provide answers to questions and useful resources it is fine.
-
@faz808 so it breaks down functionally into:
Data Analysis
Data Encoding
Error Correction Coding
Structure Final Message
Module Placement in Matrix
Data Masking
Format and Version InformationDo you have any preference? The data analysis looks fairly straightforward. Are we even going to bother with Kanji at this point?
-
@pianofire That is awesome!
Actually it would be nice to have access to some sort of roll-out plan? To know which features are coming and approximately when?
-
Good question. Is simple alphanumeric mode going to any easier?
Looking at the article, I think the first step might be to write a binary - hex/hex - binary function. This would confirm each step of the authors calculations. -
@faz808 Well I have already written hex to decimal and (vice versa) https://fuzearena.com/forum/topic/965/hexadecimal-conversion-functions
-
@vinicity said in File Export:
@pianofire That is awesome!
Actually it would be nice to have access to some sort of roll-out plan? To know which features are coming and approximately when?
That would be wonderful and even if some of the things were way late or never even turned up, it would be still better than not having a clue as we are now.
-
@SteveZX81 It is difficult to raise people's expectations and then not deliver. Anyway it is not up to me
-
@faz808 OK I have done the data analysis phase (except for Kanji). I have shared it but it is subject to approval. If you add me as a friend you should be able to see it before approval (SW-5218-2817-5887)
-
Fast track approval! It is NXK7DXUMMN
-
@pianofire That was fast ! The next step could be trickier ...
-
This could prove a major stumbling block - Error Correction Coding.
-
@faz808 Well that was the easy bit!
-
@faz808 Yes it looks fun! https://www.thonky.com/qr-code-tutorial/error-correction-coding I have some C# code that I might try to convert
-
I'll leave that bit with you then. My brain needs a rest - it's hurting...
-
@faz808 OK will you look at encoding then?
-
I'll give it go.
-
Getting there - slowly...
encoder ID: MXK7BH2UW5 -
@faz808 No rush. I am still keying in this monster! https://www.thonky.com/qr-code-tutorial/error-correction-table
-
What a team !
-
Finished the table!
// QRCode Error Correction // by Pianofire // Version WIP struct ECBlock string name // Version-Level int g1b // Group 1 Blocks int g1d // Data Codewords in Group 1 int g2b // Group 2 Blocks int g2d // Data Codewords in Group 2 int tdc // Total Data Codewords endstruct ECBlock ecBlocks = [ [ .name = "1-L", .g1b = 1, .g1d = 19, .g2b = 0, .g2d = 0, .tdc = 19 ], [ .name = "1-M", .g1b = 1, .g1d = 16, .g2b = 0, .g2d = 0, .tdc = 16 ], [ .name = "1-Q", .g1b = 1, .g1d = 13, .g2b = 0, .g2d = 0, .tdc = 13 ], [ .name = "1-H", .g1b = 1, .g1d = 9, .g2b = 0, .g2d = 0, .tdc = 9 ], [ .name = "2-L", .g1b = 1, .g1d = 34, .g2b = 0, .g2d = 0, .tdc = 34 ], [ .name = "2-M", .g1b = 1, .g1d = 28, .g2b = 0, .g2d = 0, .tdc = 28 ], [ .name = "2-Q", .g1b = 1, .g1d = 22, .g2b = 0, .g2d = 0, .tdc = 22 ], [ .name = "2-H", .g1b = 1, .g1d = 16, .g2b = 0, .g2d = 0, .tdc = 16 ], [ .name = "3-L", .g1b = 1, .g1d = 55, .g2b = 0, .g2d = 0, .tdc = 55 ], [ .name = "3-M", .g1b = 1, .g1d = 44, .g2b = 0, .g2d = 0, .tdc = 44 ], [ .name = "3-Q", .g1b = 2, .g1d = 17, .g2b = 0, .g2d = 0, .tdc = 34 ], [ .name = "3-H", .g1b = 2, .g1d = 13, .g2b = 0, .g2d = 0, .tdc = 26 ], [ .name = "4-L", .g1b = 1, .g1d = 80, .g2b = 0, .g2d = 0, .tdc = 80 ], [ .name = "4-M", .g1b = 2, .g1d = 32, .g2b = 0, .g2d = 0, .tdc = 64 ], [ .name = "4-Q", .g1b = 2, .g1d = 24, .g2b = 0, .g2d = 0, .tdc = 48 ], [ .name = "4-H", .g1b = 4, .g1d = 9, .g2b = 0, .g2d = 0, .tdc = 36 ], [ .name = "5-L", .g1b = 1, .g1d = 108, .g2b = 0, .g2d = 0, .tdc = 108 ], [ .name = "5-M", .g1b = 2, .g1d = 43, .g2b = 0, .g2d = 0, .tdc = 86 ], [ .name = "5-Q", .g1b = 2, .g1d = 15, .g2b = 2, .g2d = 16, .tdc = 62 ], [ .name = "5-H", .g1b = 2, .g1d = 11, .g2b = 2, .g2d = 12, .tdc = 46 ], [ .name = "6-L", .g1b = 2, .g1d = 68, .g2b = 0, .g2d = 0, .tdc = 136 ], [ .name = "6-M", .g1b = 4, .g1d = 27, .g2b = 0, .g2d = 0, .tdc = 108 ], [ .name = "6-Q", .g1b = 4, .g1d = 19, .g2b = 0, .g2d = 0, .tdc = 76 ], [ .name = "6-H", .g1b = 4, .g1d = 15, .g2b = 0, .g2d = 0, .tdc = 60 ], [ .name = "7-L", .g1b = 2, .g1d = 78, .g2b = 0, .g2d = 0, .tdc = 156 ], [ .name = "7-M", .g1b = 4, .g1d = 31, .g2b = 0, .g2d = 0, .tdc = 124 ], [ .name = "7-Q", .g1b = 2, .g1d = 14, .g2b = 4, .g2d = 15, .tdc = 88 ], [ .name = "7-H", .g1b = 4, .g1d = 13, .g2b = 1, .g2d = 14, .tdc = 66 ], [ .name = "8-L", .g1b = 2, .g1d = 97, .g2b = 0, .g2d = 0, .tdc = 194 ], [ .name = "8-M", .g1b = 2, .g1d = 38, .g2b = 2, .g2d = 39, .tdc = 154 ], [ .name = "8-Q", .g1b = 4, .g1d = 18, .g2b = 2, .g2d = 19, .tdc = 110 ], [ .name = "8-H", .g1b = 4, .g1d = 14, .g2b = 2, .g2d = 15, .tdc = 86 ], [ .name = "9-L", .g1b = 2, .g1d = 116, .g2b = 0, .g2d = 0, .tdc = 232 ], [ .name = "9-M", .g1b = 3, .g1d = 36, .g2b = 2, .g2d = 37, .tdc = 182 ], [ .name = "9-Q", .g1b = 4, .g1d = 16, .g2b = 4, .g2d = 17, .tdc = 132 ], [ .name = "9-H", .g1b = 4, .g1d = 12, .g2b = 4, .g2d = 13, .tdc = 100 ], [ .name = "10-L", .g1b = 2, .g1d = 68, .g2b = 2, .g2d = 69, .tdc = 274 ], [ .name = "10-M", .g1b = 4, .g1d = 43, .g2b = 1, .g2d = 44, .tdc = 216 ], [ .name = "10-Q", .g1b = 6, .g1d = 19, .g2b = 2, .g2d = 20, .tdc = 154 ], [ .name = "10-H", .g1b = 6, .g1d = 15, .g2b = 2, .g2d = 16, .tdc = 122 ], [ .name = "11-L", .g1b = 4, .g1d = 81, .g2b = 0, .g2d = 0, .tdc = 324 ], [ .name = "11-M", .g1b = 1, .g1d = 50, .g2b = 4, .g2d = 51, .tdc = 254 ], [ .name = "11-Q", .g1b = 4, .g1d = 22, .g2b = 4, .g2d = 23, .tdc = 180 ], [ .name = "11-H", .g1b = 3, .g1d = 12, .g2b = 8, .g2d = 13, .tdc = 140 ], [ .name = "12-L", .g1b = 2, .g1d = 92, .g2b = 2, .g2d = 93, .tdc = 370 ], [ .name = "12-M", .g1b = 6, .g1d = 36, .g2b = 2, .g2d = 37, .tdc = 290 ], [ .name = "12-Q", .g1b = 4, .g1d = 20, .g2b = 6, .g2d = 21, .tdc = 206 ], [ .name = "12-H", .g1b = 7, .g1d = 14, .g2b = 4, .g2d = 15, .tdc = 158 ], [ .name = "13-L", .g1b = 4, .g1d = 107, .g2b = 0, .g2d = 0, .tdc = 428 ], [ .name = "13-M", .g1b = 8, .g1d = 37, .g2b = 1, .g2d = 38, .tdc = 334 ], [ .name = "13-Q", .g1b = 8, .g1d = 20, .g2b = 4, .g2d = 21, .tdc = 244 ], [ .name = "13-H", .g1b = 12, .g1d = 11, .g2b = 4, .g2d = 12, .tdc = 180 ], [ .name = "14-L", .g1b = 3, .g1d = 115, .g2b = 1, .g2d = 116, .tdc = 461 ], [ .name = "14-M", .g1b = 4, .g1d = 40, .g2b = 5, .g2d = 41, .tdc = 365 ], [ .name = "14-Q", .g1b = 11, .g1d = 16, .g2b = 5, .g2d = 17, .tdc = 261 ], [ .name = "14-H", .g1b = 11, .g1d = 12, .g2b = 5, .g2d = 13, .tdc = 197 ], [ .name = "15-L", .g1b = 5, .g1d = 87, .g2b = 1, .g2d = 88, .tdc = 523 ], [ .name = "15-M", .g1b = 5, .g1d = 41, .g2b = 5, .g2d = 42, .tdc = 415 ], [ .name = "15-Q", .g1b = 5, .g1d = 24, .g2b = 7, .g2d = 25, .tdc = 295 ], [ .name = "15-H", .g1b = 11, .g1d = 12, .g2b = 7, .g2d = 13, .tdc = 223 ], [ .name = "16-L", .g1b = 5, .g1d = 98, .g2b = 1, .g2d = 99, .tdc = 589 ], [ .name = "16-M", .g1b = 7, .g1d = 45, .g2b = 3, .g2d = 46, .tdc = 453 ], [ .name = "16-Q", .g1b = 15, .g1d = 19, .g2b = 2, .g2d = 20, .tdc = 325 ], [ .name = "16-H", .g1b = 3, .g1d = 15, .g2b = 13, .g2d = 16, .tdc = 253 ], [ .name = "17-L", .g1b = 1, .g1d = 107, .g2b = 5, .g2d = 108, .tdc = 647 ], [ .name = "17-M", .g1b = 10, .g1d = 46, .g2b = 1, .g2d = 47, .tdc = 507 ], [ .name = "17-Q", .g1b = 1, .g1d = 22, .g2b = 15, .g2d = 23, .tdc = 367 ], [ .name = "17-H", .g1b = 2, .g1d = 14, .g2b = 17, .g2d = 15, .tdc = 283 ], [ .name = "18-L", .g1b = 5, .g1d = 120, .g2b = 1, .g2d = 121, .tdc = 721 ], [ .name = "18-M", .g1b = 9, .g1d = 43, .g2b = 4, .g2d = 44, .tdc = 563 ], [ .name = "18-Q", .g1b = 17, .g1d = 22, .g2b = 1, .g2d = 23, .tdc = 397 ], [ .name = "18-H", .g1b = 2, .g1d = 14, .g2b = 19, .g2d = 15, .tdc = 313 ], [ .name = "19-L", .g1b = 3, .g1d = 113, .g2b = 4, .g2d = 114, .tdc = 795 ], [ .name = "19-M", .g1b = 3, .g1d = 44, .g2b = 11, .g2d = 45, .tdc = 627 ], [ .name = "19-Q", .g1b = 17, .g1d = 21, .g2b = 4, .g2d = 22, .tdc = 445 ], [ .name = "19-H", .g1b = 9, .g1d = 13, .g2b = 16, .g2d = 14, .tdc = 341 ], [ .name = "20-L", .g1b = 3, .g1d = 107, .g2b = 5, .g2d = 108, .tdc = 861 ], [ .name = "20-M", .g1b = 3, .g1d = 41, .g2b = 13, .g2d = 42, .tdc = 669 ], [ .name = "20-Q", .g1b = 15, .g1d = 24, .g2b = 5, .g2d = 25, .tdc = 485 ], [ .name = "20-H", .g1b = 15, .g1d = 15, .g2b = 10, .g2d = 16, .tdc = 385 ], [ .name = "21-L", .g1b = 4, .g1d = 116, .g2b = 4, .g2d = 117, .tdc = 932 ], [ .name = "21-M", .g1b = 17, .g1d = 42, .g2b = 0, .g2d = 0, .tdc = 714 ], [ .name = "21-Q", .g1b = 17, .g1d = 22, .g2b = 6, .g2d = 23, .tdc = 512 ], [ .name = "21-H", .g1b = 19, .g1d = 16, .g2b = 6, .g2d = 17, .tdc = 406 ], [ .name = "22-L", .g1b = 2, .g1d = 111, .g2b = 7, .g2d = 112, .tdc = 1006 ], [ .name = "22-M", .g1b = 17, .g1d = 46, .g2b = 0, .g2d = 0, .tdc = 782 ], [ .name = "22-Q", .g1b = 7, .g1d = 24, .g2b = 16, .g2d = 25, .tdc = 568 ], [ .name = "22-H", .g1b = 34, .g1d = 13, .g2b = 0, .g2d = 0, .tdc = 442 ], [ .name = "23-L", .g1b = 4, .g1d = 121, .g2b = 5, .g2d = 122, .tdc = 1094 ], [ .name = "23-M", .g1b = 4, .g1d = 47, .g2b = 14, .g2d = 48, .tdc = 860 ], [ .name = "23-Q", .g1b = 11, .g1d = 24, .g2b = 14, .g2d = 25, .tdc = 614 ], [ .name = "23-H", .g1b = 16, .g1d = 15, .g2b = 14, .g2d = 16, .tdc = 464 ], [ .name = "24-L", .g1b = 6, .g1d = 117, .g2b = 4, .g2d = 118, .tdc = 1174 ], [ .name = "24-M", .g1b = 6, .g1d = 45, .g2b = 14, .g2d = 46, .tdc = 914 ], [ .name = "24-Q", .g1b = 11, .g1d = 24, .g2b = 16, .g2d = 25, .tdc = 664 ], [ .name = "24-H", .g1b = 30, .g1d = 16, .g2b = 2, .g2d = 17, .tdc = 514 ], [ .name = "25-L", .g1b = 8, .g1d = 106, .g2b = 4, .g2d = 107, .tdc = 1276 ], [ .name = "25-M", .g1b = 8, .g1d = 47, .g2b = 13, .g2d = 48, .tdc = 1000 ], [ .name = "25-Q", .g1b = 7, .g1d = 24, .g2b = 22, .g2d = 25, .tdc = 718 ], [ .name = "25-H", .g1b = 22, .g1d = 15, .g2b = 13, .g2d = 16, .tdc = 538 ], [ .name = "26-L", .g1b = 10, .g1d = 114, .g2b = 2, .g2d = 115, .tdc = 1370 ], [ .name = "26-M", .g1b = 19, .g1d = 46, .g2b = 4, .g2d = 47, .tdc = 1062 ], [ .name = "26-Q", .g1b = 28, .g1d = 22, .g2b = 6, .g2d = 23, .tdc = 754 ], [ .name = "26-H", .g1b = 33, .g1d = 16, .g2b = 4, .g2d = 17, .tdc = 596 ], [ .name = "27-L", .g1b = 8, .g1d = 122, .g2b = 4, .g2d = 123, .tdc = 1468 ], [ .name = "27-M", .g1b = 22, .g1d = 45, .g2b = 3, .g2d = 46, .tdc = 1128 ], [ .name = "27-Q", .g1b = 8, .g1d = 23, .g2b = 26, .g2d = 24, .tdc = 808 ], [ .name = "27-H", .g1b = 12, .g1d = 15, .g2b = 28, .g2d = 16, .tdc = 628 ], [ .name = "28-L", .g1b = 3, .g1d = 117, .g2b = 10, .g2d = 118, .tdc = 1531 ], [ .name = "28-M", .g1b = 3, .g1d = 45, .g2b = 23, .g2d = 46, .tdc = 1193 ], [ .name = "28-Q", .g1b = 4, .g1d = 24, .g2b = 31, .g2d = 25, .tdc = 871 ], [ .name = "28-H", .g1b = 11, .g1d = 15, .g2b = 31, .g2d = 16, .tdc = 661 ], [ .name = "29-L", .g1b = 7, .g1d = 116, .g2b = 7, .g2d = 117, .tdc = 1631 ], [ .name = "29-M", .g1b = 21, .g1d = 45, .g2b = 7, .g2d = 46, .tdc = 1267 ], [ .name = "29-Q", .g1b = 1, .g1d = 23, .g2b = 37, .g2d = 24, .tdc = 911 ], [ .name = "29-H", .g1b = 19, .g1d = 15, .g2b = 26, .g2d = 16, .tdc = 701 ], [ .name = "30-L", .g1b = 5, .g1d = 115, .g2b = 10, .g2d = 116, .tdc = 1735 ], [ .name = "30-M", .g1b = 19, .g1d = 47, .g2b = 10, .g2d = 48, .tdc = 1373 ], [ .name = "30-Q", .g1b = 15, .g1d = 24, .g2b = 25, .g2d = 25, .tdc = 985 ], [ .name = "30-H", .g1b = 23, .g1d = 15, .g2b = 25, .g2d = 16, .tdc = 745 ], [ .name = "31-L", .g1b = 13, .g1d = 115, .g2b = 3, .g2d = 116, .tdc = 1843 ], [ .name = "31-M", .g1b = 2, .g1d = 46, .g2b = 29, .g2d = 47, .tdc = 1455 ], [ .name = "31-Q", .g1b = 42, .g1d = 24, .g2b = 1, .g2d = 25, .tdc = 1033 ], [ .name = "31-H", .g1b = 23, .g1d = 15, .g2b = 28, .g2d = 16, .tdc = 793 ], [ .name = "32-L", .g1b = 17, .g1d = 115, .g2b = 0, .g2d = 0, .tdc = 1955 ], [ .name = "32-M", .g1b = 10, .g1d = 46, .g2b = 23, .g2d = 47, .tdc = 1541 ], [ .name = "32-Q", .g1b = 10, .g1d = 24, .g2b = 35, .g2d = 25, .tdc = 1115 ], [ .name = "32-H", .g1b = 19, .g1d = 15, .g2b = 35, .g2d = 16, .tdc = 845 ], [ .name = "33-L", .g1b = 17, .g1d = 115, .g2b = 1, .g2d = 116, .tdc = 2071 ], [ .name = "33-M", .g1b = 14, .g1d = 46, .g2b = 21, .g2d = 47, .tdc = 1631 ], [ .name = "33-Q", .g1b = 29, .g1d = 24, .g2b = 19, .g2d = 25, .tdc = 1171 ], [ .name = "33-H", .g1b = 11, .g1d = 15, .g2b = 46, .g2d = 16, .tdc = 901 ], [ .name = "34-L", .g1b = 13, .g1d = 115, .g2b = 6, .g2d = 116, .tdc = 2191 ], [ .name = "34-M", .g1b = 14, .g1d = 46, .g2b = 23, .g2d = 47, .tdc = 1725 ], [ .name = "34-Q", .g1b = 44, .g1d = 24, .g2b = 7, .g2d = 25, .tdc = 1231 ], [ .name = "34-H", .g1b = 59, .g1d = 16, .g2b = 1, .g2d = 17, .tdc = 961 ], [ .name = "35-L", .g1b = 12, .g1d = 121, .g2b = 7, .g2d = 122, .tdc = 2306 ], [ .name = "35-M", .g1b = 12, .g1d = 47, .g2b = 26, .g2d = 48, .tdc = 1812 ], [ .name = "35-Q", .g1b = 39, .g1d = 24, .g2b = 14, .g2d = 25, .tdc = 1286 ], [ .name = "35-H", .g1b = 22, .g1d = 15, .g2b = 41, .g2d = 16, .tdc = 986 ], [ .name = "36-L", .g1b = 6, .g1d = 121, .g2b = 14, .g2d = 122, .tdc = 2434 ], [ .name = "36-M", .g1b = 6, .g1d = 47, .g2b = 34, .g2d = 48, .tdc = 1914 ], [ .name = "36-Q", .g1b = 46, .g1d = 24, .g2b = 10, .g2d = 25, .tdc = 1354 ], [ .name = "36-H", .g1b = 2, .g1d = 15, .g2b = 64, .g2d = 16, .tdc = 1054 ], [ .name = "37-L", .g1b = 17, .g1d = 122, .g2b = 4, .g2d = 123, .tdc = 2566 ], [ .name = "37-M", .g1b = 29, .g1d = 46, .g2b = 14, .g2d = 47, .tdc = 1992 ], [ .name = "37-Q", .g1b = 49, .g1d = 24, .g2b = 10, .g2d = 25, .tdc = 1426 ], [ .name = "37-H", .g1b = 24, .g1d = 15, .g2b = 46, .g2d = 16, .tdc = 1096 ], [ .name = "38-L", .g1b = 4, .g1d = 122, .g2b = 18, .g2d = 123, .tdc = 2702 ], [ .name = "38-M", .g1b = 13, .g1d = 46, .g2b = 32, .g2d = 47, .tdc = 2102 ], [ .name = "38-Q", .g1b = 48, .g1d = 24, .g2b = 14, .g2d = 25, .tdc = 1502 ], [ .name = "38-H", .g1b = 42, .g1d = 15, .g2b = 32, .g2d = 16, .tdc = 1142 ], [ .name = "39-L", .g1b = 20, .g1d = 117, .g2b = 4, .g2d = 118, .tdc = 2812 ], [ .name = "39-M", .g1b = 40, .g1d = 47, .g2b = 7, .g2d = 48, .tdc = 2216 ], [ .name = "39-Q", .g1b = 43, .g1d = 24, .g2b = 22, .g2d = 25, .tdc = 1582 ], [ .name = "39-H", .g1b = 10, .g1d = 15, .g2b = 67, .g2d = 16, .tdc = 1222 ], [ .name = "40-L", .g1b = 19, .g1d = 118, .g2b = 6, .g2d = 119, .tdc = 2956 ], [ .name = "40-M", .g1b = 18, .g1d = 47, .g2b = 31, .g2d = 48, .tdc = 2334 ], [ .name = "40-Q", .g1b = 34, .g1d = 24, .g2b = 34, .g2d = 25, .tdc = 1666 ], [ .name = "40-H", .g1b = 20, .g1d = 15, .g2b = 61, .g2d = 16, .tdc = 1276 ] ] verifyECBlocks() ecb = getECBlock( 22, "H" ) print(ecb) update() sleep(10) // get the error correction block for the specified version and level // version: 1-40 // level: L, M, Q, H function getECBlock( version, level ) ECBlock result = [ .name = "", .g1b = 0, .g1d = 0, .g2b = 0, .g2d = 0, .tdc = 0 ] int i string name = str( version ) + "-" + level for i = 0 to len( ecBlocks ) loop if ecBlocks[ i ].name == name then result = ecBlocks[ i ] break endif repeat return result // Check that total data codewords match with expected // prints any that don't function verifyECBlocks() for i = 0 to len(ecBlocks) loop ecb = ecBlocks[i] if ecb.tdc != ( ecb.g1b * ecb.g1d ) + ( ecb.g2b * ecb.g2d ) then print(ecb, "\n") endif repeat return void