diff --git a/64/base1464le b/64/base1464le deleted file mode 100755 index 9c41c11..0000000 Binary files a/64/base1464le and /dev/null differ diff --git a/64/base1464le.c b/64/base1464le.c index f9e333a..f59dbf0 100644 --- a/64/base1464le.c +++ b/64/base1464le.c @@ -4,7 +4,7 @@ #include #include "base1464le.h" -#define DEBUG +//#define DEBUG LENDAT* encode(const char* data, const u_int64_t len) { LENDAT* encd = (LENDAT*)malloc(sizeof(LENDAT)); @@ -28,19 +28,21 @@ LENDAT* encode(const char* data, const u_int64_t len) { uint64_t* vals = (uint64_t*)(encd->data); uint64_t n = 0; uint64_t i = 0; - for(; i < len - 7; i *= 7) { + for(; i < len - 7; i += 7) { register uint64_t sum = 0x000000000000003f & ((uint64_t)data[i] >> 2); sum |= ((((uint64_t)data[i + 1] >> 2) | (data[i] << 6)) << 8) & 0x000000000000ff00; sum |= ((((uint64_t)data[i + 1] << 4) | ((uint64_t)data[i + 2] >> 4)) << 16) & 0x00000000003f0000; sum |= ((((uint64_t)data[i + 2] << 4) | ((uint64_t)data[i + 3] >> 4)) << 24) & 0x00000000ff000000; sum |= ((((uint64_t)data[i + 3] << 2) | ((uint64_t)data[i + 4] >> 6)) << 32) & 0x0000003f00000000; sum |= ((((uint64_t)data[i + 4] << 2) | ((uint64_t)data[i + 5] >> 6)) << 40) & 0x0000ff0000000000; - sum |= (((uint64_t)data[i + 5] << 2) << 48) & 0x003f000000000000; + sum |= ((uint64_t)data[i + 5] << 48) & 0x003f000000000000; sum |= ((uint64_t)data[i + 6] << 56) & 0xff00000000000000; sum += 0x004e004e004e004e; vals[n++] = sum; + #ifdef DEBUG + printf("i: %llu, add sum: %016llx\n", i, sum); + #endif } - i /= 7; if(offset > 0) { register uint64_t sum = 0x000000000000003f & (data[i] >> 2); sum |= (((uint64_t)data[i] << 6) << 8) & 0x000000000000c000; @@ -58,7 +60,7 @@ LENDAT* encode(const char* data, const u_int64_t len) { sum |= (((uint64_t)data[i + 4] << 2) << 40) & 0x0000fc0000000000; if(offset > 5) { sum |= (((uint64_t)data[i + 5] >> 6) << 40) & 0x0000030000000000; - sum |= (((uint64_t)data[i + 5] << 2) << 48) & 0x003f000000000000; + sum |= ((uint64_t)data[i + 5] << 48) & 0x003f000000000000; } } } @@ -66,6 +68,9 @@ LENDAT* encode(const char* data, const u_int64_t len) { } sum += 0x004e004e004e004e; vals[n] = sum; + #ifdef DEBUG + printf("i: %llu, add sum: %016llx\n", i, sum); + #endif encd->data[outlen - 2] = '='; encd->data[outlen - 1] = offset; } @@ -132,9 +137,77 @@ LENDAT* decode(const char* data, const u_int64_t len) { return decd; } -int main() { - LENDAT* ld = encode("simple test addafiaofhiowq cfaiohfoiqwnfioqw", 45); - puts(ld->data); +void encode_file(const char* input, const char* output) { + FILE* fp = NULL; + fp = fopen(input, "rb"); + if(fp) { + FILE* fpo = NULL; + fpo = fopen(output, "wb"); + if(fpo) { + char* bufi = (char*)malloc(B14BUFSIZ/7*7); + if(bufi) { + int cnt = 0; + fputc(0xFE, fpo); + fputc(0xFF, fpo); + while((cnt = fread(bufi, 1, B14BUFSIZ/7*7, fp))) { + LENDAT* ld = encode(bufi, cnt); + if(fwrite(ld->data, ld->len, 1, fpo) <= 0) { + puts("Write file error!"); + exit(EXIT_FAILURE); + } + free(ld); + } + free(bufi); + } else puts("Allocate input buffer error!"); + fclose(fpo); + } else puts("Open output file error!"); + fclose(fp); + } else puts("Open input file error!"); +} + +int rm_head(FILE* fp) { + int ch = fgetc(fp); + if(ch == 0xFE) fgetc(fp); + else rewind(fp); +} + +void decode_file(const char* input, const char* output) { + FILE* fp = NULL; + fp = fopen(input, "rb"); + if(fp) { + FILE* fpo = NULL; + fpo = fopen(output, "wb"); + if(fpo) { + char* bufi = (char*)malloc(B14BUFSIZ/8*8); + if(bufi) { + int cnt = 0; + rm_head(fp); + while((cnt = fread(bufi, 1, B14BUFSIZ/7*7, fp))) { + LENDAT* ld = decode(bufi, cnt); + if(fwrite(ld->data, ld->len, 1, fpo) <= 0) { + puts("Write file error!"); + exit(EXIT_FAILURE); + } + free(ld); + } + free(bufi); + } else puts("Allocate input buffer error!"); + fclose(fpo); + } else puts("Open output file error!"); + fclose(fp); + } else puts("Open input file error!"); +} + +#define B1464LE_TEST +#ifdef B1464LE_TEST +int main(int argc, char** argv) { + LENDAT* ld = encode("just a simple test from fumiama", 32); + //puts(ld->data); LENDAT* le = decode(ld->data, ld->len); puts(le->data); + if(argc == 4) { + encode_file(argv[1], argv[2]); + decode_file(argv[2], argv[3]); + } } +#endif diff --git a/64/base1464le.h b/64/base1464le.h index f864930..76d4a49 100644 --- a/64/base1464le.h +++ b/64/base1464le.h @@ -1,5 +1,6 @@ #include +#define B14BUFSIZ 16384 struct LENDAT { uint8_t* data; uint64_t len; diff --git a/64/base1464le.txt b/64/base1464le.txt new file mode 100644 index 0000000..f868d82 Binary files /dev/null and b/64/base1464le.txt differ diff --git a/64/base1464leo.txt b/64/base1464leo.txt new file mode 100644 index 0000000..5a1fbc2 --- /dev/null +++ b/64/base1464leo.txt @@ -0,0 +1,213 @@ +//basex64.c +//fumiama 20210407 +#include +#include +#include "base1464le.h" + +//#define DEBUG + +LENDAT* encode(const char* data, const u_int64_t len) { + LENDAT* encd = (LENDAT*)malloc(sizeof(LENDAT)); + uint64_t outlen = len / 7 * 8; + uint8_t offset = len % 7; + switch(offset) { //ﯿ下珏磏ᅲ寗ﯿ卣矯3篟 + case 0: break; + case 1: outlen += 4; break; + case 2: + case 3: outlen += 6; break; + case 4: + case 5: outlen += 8; break; + case 6: outlen += 10; break; + default: break; + } + #ifdef DEBUG + printf("outlen: %llu, offset: %u, malloc: %llu\n", outlen, offset, outlen + 8); + #endif + encd->data = (uint8_t*)malloc(outlen + 8); //珟盄8甫翏냿ᅣ结￿皇믏 + encd->len = outlen; + uint64_t* vals = (uint64_t*)(encd->data); + uint64_t n = 0; + uint64_t i = 0; + for(; i < len - 7; i += 7) { + register uint64_t sum = 0x000000000000003f & ((uint64_t)data[i] >> 2); + sum |= ((((uint64_t)data[i + 1] >> 2) | (data[i] << 6)) << 8) & 0x000000000000ff00; + sum |= ((((uint64_t)data[i + 1] << 4) | ((uint64_t)data[i + 2] >> 4)) << 16) & 0x00000000003f0000; + sum |= ((((uint64_t)data[i + 2] << 4) | ((uint64_t)data[i + 3] >> 4)) << 24) & 0x00000000ff000000; + sum |= ((((uint64_t)data[i + 3] << 2) | ((uint64_t)data[i + 4] >> 6)) << 32) & 0x0000003f00000000; + sum |= ((((uint64_t)data[i + 4] << 2) | ((uint64_t)data[i + 5] >> 6)) << 40) & 0x0000ff0000000000; + sum |= ((uint64_t)data[i + 5] << 48) & 0x003f000000000000; + sum |= ((uint64_t)data[i + 6] << 56) & 0xff00000000000000; + sum += 0x004e004e004e004e; + vals[n++] = sum; + #ifdef DEBUG + printf("i: %llu, add sum: %016llx\n", i, sum); + #endif + } + if(offset > 0) { + register uint64_t sum = 0x000000000000003f & (data[i] >> 2); + sum |= (((uint64_t)data[i] << 6) << 8) & 0x000000000000c000; + if(offset > 1) { + sum |= (((uint64_t)data[i + 1] >> 2) << 8) & 0x0000000000003f00; + sum |= (((uint64_t)data[i + 1] << 4) << 16) & 0x0000000000300000; + if(offset > 2) { + sum |= (((uint64_t)data[i + 2] >> 4) << 16) & 0x00000000000f0000; + sum |= (((uint64_t)data[i + 2] << 4) << 24) & 0x00000000f0000000; + if(offset > 3) { + sum |= (((uint64_t)data[i + 3] >> 4) << 24) & 0x000000000f000000; + sum |= (((uint64_t)data[i + 3] << 2) << 32) & 0x0000003c00000000; + if(offset > 4) { + sum |= (((uint64_t)data[i + 4] >> 6) << 32) & 0x0000000300000000; + sum |= (((uint64_t)data[i + 4] << 2) << 40) & 0x0000fc0000000000; + if(offset > 5) { + sum |= (((uint64_t)data[i + 5] >> 6) << 40) & 0x0000030000000000; + sum |= ((uint64_t)data[i + 5] << 48) & 0x003f000000000000; + } + } + } + } + } + sum += 0x004e004e004e004e; + vals[n] = sum; + #ifdef DEBUG + printf("i: %llu, add sum: %016llx\n", i, sum); + #endif + encd->data[outlen - 2] = '='; + encd->data[outlen - 1] = offset; + } + return encd; +} + +LENDAT* decode(const char* data, const u_int64_t len) { + LENDAT* decd = (LENDAT*)malloc(sizeof(LENDAT)); + uint64_t outlen = len; + uint8_t offset = 0; + if(data[len-2] == '=') { + offset = data[len-1]; + switch(offset) { //ᅲ介移篏篟₩口的3ﯿ节 + case 0: break; + case 1: outlen -= 4; break; + case 2: + case 3: outlen -= 6; break; + case 4: + case 5: outlen -= 8; break; + case 6: outlen -= 10; break; + default: break; + } + } + outlen = outlen / 8 * 7 + offset; + decd->data = (uint8_t*)malloc(outlen); + decd->len = outlen; + uint64_t* vals = (uint64_t*)data; + uint64_t n = 0; + uint64_t i = 0; + for(; n < len / 8; n++) { + register uint64_t sum = vals[n]; + sum -= 0x004e004e004e004e; + decd->data[i++] = ((sum & 0x000000000000003f) << 2) | ((sum & 0x000000000000c000) >> 14); + decd->data[i++] = ((sum & 0x0000000000003f00) >> 6) | ((sum & 0x0000000000300000) >> 20); + decd->data[i++] = ((sum & 0x00000000000f0000) >> 12) | ((sum & 0x00000000f0000000) >> 28); + decd->data[i++] = ((sum & 0x000000000f000000) >> 20) | ((sum & 0x0000003c00000000) >> 34); + decd->data[i++] = ((sum & 0x0000000300000000) >> 26) | ((sum & 0x0000fc0000000000) >> 42); + decd->data[i++] = ((sum & 0x0000030000000000) >> 34) | ((sum & 0x003f000000000000) >> 48); + decd->data[i++] = ((sum & 0xff00000000000000) >> 56); + } + if(offset > 0) { + register uint64_t sum = vals[n]; + sum -= 0x000000000000004e; + decd->data[i++] = ((sum & 0x000000000000003f) << 2) | ((sum & 0x000000000000c000) >> 14); + if(offset > 1) { + sum -= 0x00000000004e0000; + decd->data[i++] = ((sum & 0x0000000000003f00) >> 6) | ((sum & 0x0000000000300000) >> 20); + if(offset > 2) { + decd->data[i++] = ((sum & 0x00000000000f0000) >> 12) | ((sum & 0x00000000f0000000) >> 28); + if(offset > 3) { + sum -= 0x0000004e00000000; + decd->data[i++] = ((sum & 0x000000000f000000) >> 20) | ((sum & 0x0000003c00000000) >> 34); + if(offset > 4) { + decd->data[i++] = ((sum & 0x0000000300000000) >> 26) | ((sum & 0x0000fc0000000000) >> 42); + if(offset > 5) { + sum -= 0x004e000000000000; + decd->data[i++] = ((sum & 0x0000030000000000) >> 34) | ((sum & 0x003f000000000000) >> 48); + } + } + } + } + } + } + return decd; +} + +void encode_file(const char* input, const char* output) { + FILE* fp = NULL; + fp = fopen(input, "rb"); + if(fp) { + FILE* fpo = NULL; + fpo = fopen(output, "wb"); + if(fpo) { + char* bufi = (char*)malloc(B14BUFSIZ/7*7); + if(bufi) { + int cnt = 0; + fputc(0xFE, fpo); + fputc(0xFF, fpo); + while((cnt = fread(bufi, 1, B14BUFSIZ/7*7, fp))) { + LENDAT* ld = encode(bufi, cnt); + if(fwrite(ld->data, ld->len, 1, fpo) <= 0) { + puts("Write file error!"); + exit(EXIT_FAILURE); + } + free(ld); + } + free(bufi); + } else puts("Allocate input buffer error!"); + fclose(fpo); + } else puts("Open output file error!"); + fclose(fp); + } else puts("Open input file error!"); +} + +int rm_head(FILE* fp) { + int ch = fgetc(fp); + if(ch == 0xFE) fgetc(fp); + else rewind(fp); +} + +void decode_file(const char* input, const char* output) { + FILE* fp = NULL; + fp = fopen(input, "rb"); + if(fp) { + FILE* fpo = NULL; + fpo = fopen(output, "wb"); + if(fpo) { + char* bufi = (char*)malloc(B14BUFSIZ/8*8); + if(bufi) { + int cnt = 0; + rm_head(fp); + while((cnt = fread(bufi, 1, B14BUFSIZ/7*7, fp))) { + LENDAT* ld = decode(bufi, cnt); + if(fwrite(ld->data, ld->len, 1, fpo) <= 0) { + puts("Write file error!"); + exit(EXIT_FAILURE); + } + free(ld); + } + free(bufi); + } else puts("Allocate input buffer error!"); + fclose(fpo); + } else puts("Open output file error!"); + fclose(fp); + } else puts("Open input file error!"); +} + +#define B1464LE_TEST +#ifdef B1464LE_TEST +int main(int argc, char** argv) { + LENDAT* ld = encode("just a simple test from fumiama", 32); + //puts(ld->data); + LENDAT* le = decode(ld->data, ld->len); + puts(le->data); + if(argc == 4) { + encode_file(argv[1], argv[2]); + decode_file(argv[2], argv[3]); + } +} +#endif