From 549d56c996216f104c687b44b3f5a6979bfc5f4e Mon Sep 17 00:00:00 2001 From: fumiama Date: Fri, 29 Oct 2021 21:47:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=80=A7=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D32=E4=BD=8D=E7=BC=96=E7=A0=81=E9=94=99?= =?UTF-8?q?=E8=AF=AF=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=A4=A7=E7=AB=AF=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 32/base14.c | 86 +++++++++++++++++++++++++++++++---------------------- 64/base14.c | 64 ++++++++++++++++++++++++--------------- 2 files changed, 90 insertions(+), 60 deletions(-) diff --git a/32/base14.c b/32/base14.c index 8f5cbb7..03ec61b 100644 --- a/32/base14.c +++ b/32/base14.c @@ -29,24 +29,21 @@ LENDAT* encode(const uint8_t* data, const int32_t len) { uint32_t n = 0; int32_t i = 0; for(; i <= len - 7; i += 7) { - register uint32_t sum = 0x0000003f & ((uint32_t)data[i] >> 2); - sum |= (((uint32_t)data[i + 1] << 6) | (data[i] << 14)) & 0x0000ff00; - sum |= (((uint32_t)data[i + 1] << 20) | ((uint32_t)data[i + 2] << 12)) & 0x003f0000; - sum |= (((uint32_t)data[i + 2] << 28) | ((uint32_t)data[i + 3] << 20)) & 0xff000000; - sum += 0x004e004e; - vals[n++] = sum; - #ifdef DEBUG - printf("n: %u, add sum: %08x\n", n, sum); - #endif - sum = ((((uint32_t)data[i + 3] << 2) | ((uint32_t)data[i + 4] >> 6))) & 0x0000003f; - sum |= (((uint32_t)data[i + 4] << 10) | ((uint32_t)data[i + 5] << 2)) & 0x0000ff00; - sum |= ((uint32_t)data[i + 5] << 16) & 0x003f0000; - sum |= ((uint32_t)data[i + 6] << 24) & 0xff000000; - sum += 0x004e004e; - vals[n++] = sum; - #ifdef DEBUG - printf("n: %u, add sum: %08x\n", n, sum); - #endif + register uint32_t sum = 0; + register uint32_t shift = htonl(*(uint32_t*)(data+i)); + sum |= (shift>>2) & 0x3fff0000; + sum |= (shift>>4) & 0x00003fff; + sum += 0x4e004e00; + vals[n++] = ntohl(sum); + shift <<= 26; + shift &= 0x3c000000; + sum = 0; + shift |= (htonl(*(uint32_t*)(data+i+4))>>6)&0x03fffffc; + sum |= shift & 0x3fff0000; + shift >>= 2; + sum |= shift & 0x00003fff; + sum += 0x4e004e00; + vals[n++] = ntohl(sum); } uint8_t o = offset; if(o--) { @@ -61,7 +58,11 @@ LENDAT* encode(const uint8_t* data, const int32_t len) { if(o--) { sum |= ((uint32_t)data[i + 3] << 20) & 0x0f000000; sum += 0x004e004e; - vals[n++] = sum; + #if BYTE_ORDER == BIG_ENDIAN + vals[n++] = __builtin_bswap32(sum); + #else + vals[n++] = sum; + #endif sum = (((uint32_t)data[i + 3] << 2)) & 0x0000003c; if(o--) { sum |= (((uint32_t)data[i + 4] >> 6)) & 0x00000003; @@ -71,11 +72,15 @@ LENDAT* encode(const uint8_t* data, const int32_t len) { sum |= ((uint32_t)data[i + 5] << 16) & 0x003f0000; } } - sum += 0x004e004e; - vals[n] = sum; } } } + sum += 0x004e004e; + #if BYTE_ORDER == BIG_ENDIAN + vals[n] = __builtin_bswap32(sum); + #else + vals[n] = sum; + #endif encd->data[outlen - 2] = '='; encd->data[outlen - 1] = offset; } @@ -100,27 +105,35 @@ LENDAT* decode(const uint8_t* data, const int32_t len) { } } outlen = outlen / 8 * 7 + offset; - decd->data = (uint8_t*)malloc(outlen); + decd->data = (uint8_t*)malloc(outlen+1); //多出1字节用于循环覆盖 decd->len = outlen; uint32_t* vals = (uint32_t*)data; uint32_t n = 0; int32_t i = 0; - for(; i <= outlen - 7; n++) { //n实际每次自增2 - register uint32_t sum = vals[n++]; - sum -= 0x004e004e; - decd->data[i++] = ((sum & 0x0000003f) << 2) | ((sum & 0x0000c000) >> 14); - decd->data[i++] = ((sum & 0x00003f00) >> 6) | ((sum & 0x00300000) >> 20); - decd->data[i++] = ((sum & 0x000f0000) >> 12) | ((sum & 0xf0000000) >> 28); - decd->data[i] = ((sum & 0x0f000000) >> 20); - sum = vals[n]; - sum -= 0x004e004e; - decd->data[i++] |= ((sum & 0x0000003c) >> 2); - decd->data[i++] = ((sum & 0x00000003) << 6) | ((sum & 0x0000fc00) >> 10); - decd->data[i++] = ((sum & 0x00000300) >> 2) | ((sum & 0x003f0000) >> 16); - decd->data[i++] = ((sum & 0xff000000) >> 24); + for(; i <= outlen - 7; i+=7) { //n实际每次自增2 + register uint32_t sum = 0; + register uint32_t shift = htonl(vals[n++]) - 0x4e004e00; + shift <<= 2; + sum |= shift & 0xfffc0000; + shift <<= 2; + sum |= shift & 0x0003fff0; + shift = htonl(vals[n++]) - 0x4e004e00; + sum |= shift >> 26; + *(uint32_t*)(decd->data+i) = ntohl(sum); + sum = 0; + shift <<= 6; + sum |= shift & 0xffc00000; + shift <<= 2; + sum |= shift & 0x003fff00; + *(uint32_t*)(decd->data+i+4) = ntohl(sum); } if(offset--) { - register uint32_t sum = vals[n++]; + //这里有读取越界 + #if BYTE_ORDER == BIG_ENDIAN + register uint32_t sum = __builtin_bswap32(vals[n++]); + #else + register uint32_t sum = vals[n++]; + #endif sum -= 0x0000004e; decd->data[i++] = ((sum & 0x0000003f) << 2) | ((sum & 0x0000c000) >> 14); if(offset--) { @@ -130,6 +143,7 @@ LENDAT* decode(const uint8_t* data, const int32_t len) { decd->data[i++] = ((sum & 0x000f0000) >> 12) | ((sum & 0xf0000000) >> 28); if(offset--) { decd->data[i++] = (sum & 0x0f000000) >> 20; + //这里有读取越界 sum = vals[n]; sum -= 0x0000004e; decd->data[i++] |= (sum & 0x0000003c) >> 2; diff --git a/64/base14.c b/64/base14.c index 07605bb..0b433a2 100644 --- a/64/base14.c +++ b/64/base14.c @@ -1,5 +1,5 @@ -//base1464le.c -//fumiama 20210407 +//base14.c +//fumiama 20211029 #include #include #include "base14.h" @@ -29,16 +29,17 @@ LENDAT* encode(const uint8_t* data, const int64_t len) { uint64_t n = 0; int64_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] << 6) | (data[i] << 14)) & 0x000000000000ff00; - sum |= (((uint64_t)data[i + 1] << 20) | ((uint64_t)data[i + 2] << 12)) & 0x00000000003f0000; - sum |= (((uint64_t)data[i + 2] << 28) | ((uint64_t)data[i + 3] << 20)) & 0x00000000ff000000; - sum |= (((uint64_t)data[i + 3] << 34) | ((uint64_t)data[i + 4] << 26)) & 0x0000003f00000000; - sum |= (((uint64_t)data[i + 4] << 42) | ((uint64_t)data[i + 5] << 34)) & 0x0000ff0000000000; - sum |= ((uint64_t)data[i + 5] << 48) & 0x003f000000000000; - sum |= ((uint64_t)data[i + 6] << 56) & 0xff00000000000000; - sum += 0x004e004e004e004e; - vals[n++] = sum; + register uint64_t sum = 0; + register uint64_t shift = htonll(*(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++] = ntohll(sum); #ifdef DEBUG printf("i: %llu, add sum: %016llx\n", i, sum); #endif @@ -68,7 +69,11 @@ LENDAT* encode(const uint8_t* data, const int64_t len) { } } sum += 0x004e004e004e004e; - vals[n] = sum; + #if BYTE_ORDER == BIG_ENDIAN + vals[n] = __builtin_bswap64(sum); + #else + vals[n] = sum; + #endif #ifdef DEBUG printf("i: %llu, add sum: %016llx\n", i, sum); #endif @@ -96,23 +101,34 @@ LENDAT* decode(const uint8_t* data, const int64_t len) { } } outlen = outlen / 8 * 7 + offset; - decd->data = (uint8_t*)malloc(outlen); + decd->data = (uint8_t*)malloc(outlen+1); //多出1字节用于循环覆盖 decd->len = outlen; uint64_t* vals = (uint64_t*)data; uint64_t n = 0; int64_t i = 0; - for(; i <= outlen - 7; n++) { - register uint64_t sum = vals[n] - 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); + for(; i <= outlen - 7; n++, i+=7) { + register uint64_t sum = 0; + register uint64_t shift = htonll(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*)(decd->data+i) = ntohll(sum); + #ifdef DEBUG + printf("i: %llu, add sum: %016llx\n", i, sum); + #endif } if(offset--) { - register uint64_t sum = vals[n] - 0x000000000000004e; + //这里有读取越界 + #if BYTE_ORDER == BIG_ENDIAN + register uint64_t sum = __builtin_bswap64(vals[n]) - 0x000000000000004e; + #else + register uint64_t sum = vals[n] - 0x000000000000004e; + #endif decd->data[i++] = ((sum & 0x000000000000003f) << 2) | ((sum & 0x000000000000c000) >> 14); if(offset--) { sum -= 0x00000000004e0000;