first commit

This commit is contained in:
2026-02-21 17:11:31 +09:00
commit 18b4338361
4001 changed files with 365464 additions and 0 deletions

View File

@@ -0,0 +1,207 @@
#include "fm_base64.h"
#if (ENCODE_CFG_BASE64)
#include <QFile>
static const unsigned char base64_table[65] = "0123456789+/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Changed Code...
#define BASE64_MARK_SIZE 4
static const unsigned char base64_start_mark[BASE64_MARK_SIZE] = { 0x1B, 0x9B, 0x1B, 0x9C };
static const unsigned char base64_end_mark[BASE64_MARK_SIZE] = { 0x1B, 0x9C, 0x1B, 0x9D };
/* base64_encode - Base64 encode */
uint8_t* FMBase64::mg_base64_encode(const uint8_t *src, uint32_t len, uint32_t *out_len)
{
uint8_t *out, *pos;
const uint8_t *end, *in;
uint32_t olen;
int line_len;
olen = len * 4 / 3 + 4; /* 3-byte blocks to 4-byte */
olen += olen / 72; /* line feeds */
olen++; /* nul termination */
if (olen < len) return NULL; /* integer overflow */
out = (uint8_t*)malloc(olen+(BASE64_MARK_SIZE*2));
memset(out,0,olen+(BASE64_MARK_SIZE*2));
if (out == NULL) return NULL;
end = src + len;
in = src;
pos = out;
line_len = 0;
memcpy((void*)pos, base64_start_mark, BASE64_MARK_SIZE);
pos += BASE64_MARK_SIZE;
while (end - in >= 3) {
*pos++ = base64_table[in[0] >> 2];
*pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)];
*pos++ = base64_table[((in[1] & 0x0f) << 2) | (in[2] >> 6)];
*pos++ = base64_table[in[2] & 0x3f];
in += 3;
line_len += 4;
if (line_len >= 72) {
*pos++ = '\n';
line_len = 0;
}
}
if (end - in) {
*pos++ = base64_table[in[0] >> 2];
if (end - in == 1) {
*pos++ = base64_table[(in[0] & 0x03) << 4];
*pos++ = '=';
} else {
*pos++ = base64_table[((in[0] & 0x03) << 4) |
(in[1] >> 4)];
*pos++ = base64_table[(in[1] & 0x0f) << 2];
}
*pos++ = '=';
line_len += 4;
}
if (line_len) *pos++ = '\n';
memcpy((void*)pos, base64_end_mark, BASE64_MARK_SIZE);
pos += BASE64_MARK_SIZE;
*pos = '\0';
if (out_len) *out_len = pos - out;
return out;
}
/* base64_decode - Base64 decode */
uint8_t* FMBase64::mg_base64_decode(uint8_t *src, uint32_t len, uint32_t *out_len)
{
uint8_t dtable[256], *out, *pos, block[4], tmp;
uint32_t i, count, olen;
int pad = 0;
if(src == NULL || len <= BASE64_MARK_SIZE*2) return NULL;
if(memcmp((void*)&src[0], base64_start_mark, BASE64_MARK_SIZE) ||
memcmp((void*)&src[len-BASE64_MARK_SIZE], base64_end_mark, BASE64_MARK_SIZE)) {
return NULL;
}
src += BASE64_MARK_SIZE;
len -= BASE64_MARK_SIZE*2;
memset((void*)dtable, 0x80, 256);
for (i = 0; i < sizeof(base64_table) - 1; i++)
dtable[base64_table[i]] = (uint8_t) i;
dtable['='] = 0;
count = 0;
for (i = 0; i < len; i++) {
if (dtable[src[i]] != 0x80) count++;
}
if (count == 0 || count % 4) return NULL;
olen = count / 4 * 3;
//qInfo() << olen << olen + (olen % 2048) << __FUNCTION__;
pos = out = (uint8_t*)malloc(qMax(olen,(uint32_t)4096));
memset(out,0,olen);
if (out == NULL) return NULL;
count = 0;
for (i = 0; i < len; i++) {
tmp = dtable[src[i]];
if (tmp == 0x80) continue;
if (src[i] == '=') pad++;
block[count] = tmp;
count++;
if (count == 4) {
*pos++ = (block[0] << 2) | (block[1] >> 4);
*pos++ = (block[1] << 4) | (block[2] >> 2);
*pos++ = (block[2] << 6) | block[3];
count = 0;
if (pad) {
if (pad == 1) pos--;
else if (pad == 2) pos -= 2;
else {
/* Invalid padding */
free((void*)out);
return NULL;
}
break;
}
}
}
*out_len = pos - out;
return out;
}
// 파일 확인하여 텍스트 스트림으로 처리
QStringList FMBase64::load(QString path, bool* isEncoded)
{
QFile file(path);
if(file.exists() && file.open(QIODevice::ReadOnly))
{
uint32_t len = (uint32_t)(file.size() + (file.size() % 8));
uint8_t* buffer = (uint8_t*)malloc(len);
memset(buffer,0,len);
file.read((char*)buffer,file.size());
uint8_t* text = buffer;
// MARK 확인 , 0x9C, 0x1B, 0x9D
if(buffer[0] == base64_start_mark[0] &&
buffer[1] == base64_start_mark[1] &&
buffer[2] == base64_start_mark[2] &&
buffer[3] == base64_start_mark[3] &&
buffer[file.size()-4] == base64_end_mark[0] &&
buffer[file.size()-3] == base64_end_mark[1] &&
buffer[file.size()-2] == base64_end_mark[2] &&
buffer[file.size()-1] == base64_end_mark[3]) {
*isEncoded = true;
uint32_t outlen = 0;
text = mg_base64_decode(buffer, file.size(),&outlen);
text[outlen] = 0;
} else {
*isEncoded = false;
}
QString lines = QString::fromLatin1((char*)text);
file.close();
if(buffer != text) {
free(text);
}
free(buffer);
return lines.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
}
return QStringList();
}
void FMBase64::save(QString path, QStringList lines, bool isEncoded)
{
// \r\n
QString str = QString();
for(int i=0;i<lines.size();i++) {
str += lines.at(i);
str += "\r\n";
}
QByteArray ba = str.toLatin1();
const uint8_t * src = (uint8_t*)ba.data();
uint8_t* dest = NULL;
uint32_t out_len = ba.size();
if(true) { // isEncoded) {
dest = mg_base64_encode(src, ba.size(),&out_len);
} else {
size_t ss = ba.size() + (ba.size() % 8);
dest = (uint8_t*)malloc(ss);
memset(dest,0,ss);
memcpy(dest,ba.data(),ba.size());
}
QFile file(path);
if (file.open(QIODevice::WriteOnly)) {
file.write((char*)dest,out_len);
file.close();
}
free(dest);
}
#endif // #if (ENCODE_CFG_BASE64)