-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
115 lines (93 loc) · 3.11 KB
/
main.cpp
File metadata and controls
115 lines (93 loc) · 3.11 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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "core.hpp"
#include <cstdint>
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstring>
void print_bytes(unsigned long num) {
const char *prefix = " KMGTP";
int frac = 0;
int p = 0;
while (num >= 1024) {
frac = (num & 1023) * 100 / 1024;
num >>= 10;
p++;
if (prefix[p+1] == '\0') break;
}
std::cout << num;
if (frac > 0) std::cout << '.' << std::setfill('0') << std::setw(2) << frac;
std::cout << ' ';
if (prefix[p] != ' ') std::cout << prefix[p];
std::cout << 'B';
}
void gen_test_data(uint8_t* dat, int n) {
uint16_t x = 1234;
for (int i = 0; i < n; i++) {
dat[i] = x;
dat[i] = i;
x = 5101 * x + 709;
}
}
int get_file_data(const std::string& filename, uint8_t* dat, int N) {
std::ifstream fp(filename, std::ios::binary | std::ios::ate);
if (!fp) return -1;
const size_t file_size = fp.tellg();
const size_t header_size = 1 + filename.size() + 1 + 4; // 0x01 + filename + null + 4-byte size
if (header_size + file_size > N) return -1;
fp.seekg(0);
dat[0] = 0x01;
std::memcpy(dat + 1, filename.c_str(), filename.size() + 1);
// Write 4-byte little-endian file size
for (int i = 0; i < 4; i++)
dat[header_size - 4 + i] = (file_size >> (i * 8)) & 0xFF;
fp.read(reinterpret_cast<char*>(dat + header_size), file_size);
std::memset(dat + header_size + file_size, 0, N - header_size - file_size);
return 0;
}
int output_file(const uint8_t* dat, int N, const std::string& output_dir = "") {
if (dat[0] != 0x01) return -1; // Invalid format
// Get filename
const char* filename = reinterpret_cast<const char*>(dat + 1);
size_t filename_len = strlen(filename);
// Get file size
const uint8_t* size_ptr = dat + 1 + filename_len + 1;
uint32_t file_size = 0;
for (int i = 0; i < 4; i++)
file_size |= (size_ptr[i] << (i * 8));
const uint8_t* file_dat = size_ptr + 4;
std::string output_path = (output_dir.empty() ? filename : output_dir + "/" + filename);
//check if output exists
std::ifstream check(output_path);
if (check.is_open()) return -1;
std::ofstream fp(output_path, std::ios::binary);
if (!fp) return -1;
fp.write(reinterpret_cast<const char*>(file_dat), file_size);
return fp ? 0 : -1;
}
int main() {
generator_conf conf;
conf.ppi = 150;
conf.cor_strength = 75;
init_generator(conf);
print_bytes(conf.capacity);
std::cout << " (" << conf.efficiency * 100 << "%)\n";
// print_ec_debug_info();
uint8_t *dat = (uint8_t*)calloc(conf.capacity, sizeof(uint8_t));
//Write file to barcode
// // gen_test_data(dat, conf.capacity);
// if (get_file_data("img/write_file", dat, conf.capacity) < 0)
// std::cerr << "Failed to open / read file\n";
// generate_barcode(conf, dat, "barcode.pbm");
// return 0;
//Read file(s)
// uint8_t *test = (uint8_t*)calloc(conf.capacity, sizeof(uint8_t));
// gen_test_data(test, conf.capacity);
if (read_barcode(conf, dat, "barcode.pbm") == -1) return 0;
if (output_file(dat, conf.capacity))
std::cerr << "Failed to write data\n";
// for (int i = 0; i < conf.capacity; i++)
// if (dat[i] != test[i]) {
// std::cout << "Err " << i << ' ' << (int)dat[i] << ' ' << (int)test[i] << '\n';
// }
}