mirror of
https://github.com/fumiama/base16384.git
synced 2026-06-08 04:00:25 +08:00
feat: add param -n -t & optimize param parsing & tidy documents
This commit is contained in:
145
base1464.c
145
base1464.c
@@ -1,6 +1,6 @@
|
||||
/* base1464.c
|
||||
* This file is part of the base16384 distribution (https://github.com/fumiama/base16384).
|
||||
* Copyright (c) 2022-2023 Fumiama Minamoto.
|
||||
* Copyright (c) 2022-2024 Fumiama Minamoto.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -16,51 +16,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#ifdef __linux__
|
||||
# include <endian.h>
|
||||
#endif
|
||||
#ifdef __FreeBSD__
|
||||
# include <sys/endian.h>
|
||||
#endif
|
||||
#ifdef __NetBSD__
|
||||
# include <sys/endian.h>
|
||||
#endif
|
||||
#ifdef __OpenBSD__
|
||||
# include <sys/types.h>
|
||||
# define be16toh(x) betoh16(x)
|
||||
# define be32toh(x) betoh32(x)
|
||||
# define be64toh(x) betoh64(x)
|
||||
#endif
|
||||
#ifdef __APPLE__
|
||||
# define be16toh(x) ntohs(x)
|
||||
# define be32toh(x) ntohl(x)
|
||||
# define be64toh(x) ntohll(x)
|
||||
# define htobe16(x) ntohs(x)
|
||||
# define htobe32(x) htonl(x)
|
||||
# define htobe64(x) htonll(x)
|
||||
#endif
|
||||
#ifdef _WIN64
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
# define be16toh(x) (x)
|
||||
# define be32toh(x) (x)
|
||||
# define be64toh(x) (x)
|
||||
# define htobe16(x) (x)
|
||||
# define htobe32(x) (x)
|
||||
# define htobe64(x) (x)
|
||||
#else
|
||||
# define be16toh(x) _byteswap_ushort(x)
|
||||
# define be32toh(x) _byteswap_ulong(x)
|
||||
# define be64toh(x) _byteswap_uint64(x)
|
||||
# define htobe16(x) _byteswap_ushort(x)
|
||||
# define htobe32(x) _byteswap_ulong(x)
|
||||
# define htobe64(x) _byteswap_uint64(x)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// #define DEBUG
|
||||
#include "binary.h"
|
||||
|
||||
int base16384_encode(const char* data, int dlen, char* buf) {
|
||||
int outlen = dlen / 7 * 8;
|
||||
@@ -136,6 +92,48 @@ int base16384_encode(const char* data, int dlen, char* buf) {
|
||||
return outlen;
|
||||
}
|
||||
|
||||
int base16384_encode_unsafe(const char* data, int dlen, char* buf) {
|
||||
int outlen = dlen / 7 * 8;
|
||||
int offset = dlen % 7;
|
||||
switch(offset) { // 算上偏移标志字符占用的2字节
|
||||
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
|
||||
uint64_t* vals = (uint64_t*)buf;
|
||||
uint64_t n = 0;
|
||||
int64_t i = 0;
|
||||
for(; i < dlen; i += 7) {
|
||||
register uint64_t sum = 0;
|
||||
register uint64_t shift = htobe64(*(uint64_t*)(data+i))>>2; // 这里有读取越界
|
||||
sum |= shift & 0x3fff000000000000;
|
||||
shift >>= 2;
|
||||
sum |= shift & 0x00003fff00000000;
|
||||
shift >>= 2;
|
||||
sum |= shift & 0x000000003fff0000;
|
||||
shift >>= 2;
|
||||
sum |= shift & 0x0000000000003fff;
|
||||
sum += 0x4e004e004e004e00;
|
||||
vals[n++] = be64toh(sum);
|
||||
#ifdef DEBUG
|
||||
printf("i: %llu, add sum: %016llx\n", i, sum);
|
||||
#endif
|
||||
}
|
||||
if(offset) {
|
||||
buf[outlen - 2] = '=';
|
||||
buf[outlen - 1] = offset;
|
||||
}
|
||||
return outlen;
|
||||
}
|
||||
|
||||
int base16384_decode(const char* data, int dlen, char* buf) {
|
||||
int outlen = dlen;
|
||||
int offset = 0;
|
||||
@@ -201,3 +199,58 @@ int base16384_decode(const char* data, int dlen, char* buf) {
|
||||
}
|
||||
return outlen;
|
||||
}
|
||||
|
||||
int base16384_decode_unsafe(const char* data, int dlen, char* buf) {
|
||||
int outlen = dlen;
|
||||
int offset = 0;
|
||||
if(data[dlen-2] == '=') {
|
||||
offset = data[dlen-1];
|
||||
switch(offset) { // 算上偏移标志字符占用的2字节
|
||||
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;
|
||||
uint64_t* vals = (uint64_t*)data;
|
||||
uint64_t n = 0;
|
||||
int64_t i = 0;
|
||||
for(; i < outlen-7; n++, i+=7) {
|
||||
register uint64_t sum = 0;
|
||||
register uint64_t shift = htobe64(vals[n]) - 0x4e004e004e004e00;
|
||||
shift <<= 2;
|
||||
sum |= shift & 0xfffc000000000000;
|
||||
shift <<= 2;
|
||||
sum |= shift & 0x0003fff000000000;
|
||||
shift <<= 2;
|
||||
sum |= shift & 0x0000000fffc00000;
|
||||
shift <<= 2;
|
||||
sum |= shift & 0x00000000003fff00;
|
||||
*(uint64_t*)(buf+i) = be64toh(sum);
|
||||
#ifdef DEBUG
|
||||
printf("i: %llu, add sum: %016llx\n", i, sum);
|
||||
#endif
|
||||
}
|
||||
register uint64_t sum = 0;
|
||||
register uint64_t shift = htobe64(vals[n]);
|
||||
if(((shift>>56)&0xff) < 0x4e) shift |= 0xff00000000000000;
|
||||
if(((shift>>40)&0xff) < 0x4e) shift |= 0x0000ff0000000000;
|
||||
if(((shift>>24)&0xff) < 0x4e) shift |= 0x00000000ff000000;
|
||||
if(((shift>> 8)&0xff) < 0x4e) shift |= 0x000000000000ff00;
|
||||
shift -= 0x4e004e004e004e00;
|
||||
shift <<= 2;
|
||||
sum |= shift & 0xfffc000000000000;
|
||||
shift <<= 2;
|
||||
sum |= shift & 0x0003fff000000000;
|
||||
shift <<= 2;
|
||||
sum |= shift & 0x0000000fffc00000;
|
||||
shift <<= 2;
|
||||
sum |= shift & 0x00000000003fff00;
|
||||
*(uint64_t*)(buf+i) = be64toh(sum);
|
||||
return outlen;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user