diff --git a/.gitignore b/.gitignore
index aa724b7..2cf9b31 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,3 +13,4 @@
.externalNativeBuild
.cxx
local.properties
+/app/release
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 2c7e034..3a6d748 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -14,7 +14,6 @@
-
diff --git a/app/build.gradle b/app/build.gradle
index 1406a97..23a297a 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -11,8 +11,8 @@ android {
applicationId "top.fumiama.base16384"
minSdkVersion 23
targetSdkVersion 31
- versionCode 16
- versionName '3.2.1'
+ versionCode 17
+ versionName '3.2.2'
resConfigs "zh", "en"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
diff --git a/app/src/main/cpp/base14/32/CMakeLists.txt b/app/src/main/cpp/base14/32/CMakeLists.txt
deleted file mode 100644
index 5b4ac9b..0000000
--- a/app/src/main/cpp/base14/32/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-cmake_minimum_required(VERSION 3.0.0)
-project(base1432 VERSION 2.0)
-SET(CMAKE_BUILD_TYPE "Release")
-
-add_library(base1432 STATIC base1432le.c)
\ No newline at end of file
diff --git a/app/src/main/cpp/base14/32/base1432le.c b/app/src/main/cpp/base14/32/base1432le.c
deleted file mode 100644
index b931ab7..0000000
--- a/app/src/main/cpp/base14/32/base1432le.c
+++ /dev/null
@@ -1,179 +0,0 @@
-//base1432le.c
-//fumiama 20210408
-#include
-#include
-#if defined(__linux__)
-# include
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
-# include
-#elif defined(__OpenBSD__)
-# include
-# define be16toh(x) betoh16(x)
-# define be32toh(x) betoh32(x)
-# define be64toh(x) betoh64(x)
-#elif defined(__MAC_10_0)
-# 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
-#include "base1432le.h"
-
-//#define DEBUG
-
-LENDAT* encode(const uint8_t* data, const int32_t len) {
- LENDAT* encd = (LENDAT*)malloc(sizeof(LENDAT));
- int32_t outlen = len / 7 * 8;
- uint8_t offset = len % 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
- encd->data = (uint8_t*)malloc(outlen + 8); //冗余的8B用于可能的结尾的覆盖
- encd->len = outlen;
- uint32_t* vals = (uint32_t*)(encd->data);
- uint32_t n = 0;
- int32_t i = 0;
- for(; i <= len - 7; i += 7) {
- register uint32_t sum = 0;
- register uint32_t shift = htobe32(*(uint32_t*)(data+i));
- sum |= (shift>>2) & 0x3fff0000;
- sum |= (shift>>4) & 0x00003fff;
- sum += 0x4e004e00;
- vals[n++] = be32toh(sum);
- shift <<= 26;
- shift &= 0x3c000000;
- sum = 0;
- shift |= (htobe32(*(uint32_t*)(data+i+4))>>6)&0x03fffffc;
- sum |= shift & 0x3fff0000;
- shift >>= 2;
- sum |= shift & 0x00003fff;
- sum += 0x4e004e00;
- vals[n++] = be32toh(sum);
- }
- uint8_t o = offset;
- if(o--) {
- register uint32_t sum = 0x0000003f & (data[i] >> 2);
- sum |= ((uint32_t)data[i] << 14) & 0x0000c000;
- if(o--) {
- sum |= ((uint32_t)data[i + 1] << 6) & 0x00003f00;
- sum |= ((uint32_t)data[i + 1] << 20) & 0x00300000;
- if(o--) {
- sum |= ((uint32_t)data[i + 2] << 12) & 0x000f0000;
- sum |= ((uint32_t)data[i + 2] << 28) & 0xf0000000;
- if(o--) {
- sum |= ((uint32_t)data[i + 3] << 20) & 0x0f000000;
- sum += 0x004e004e;
-#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;
- sum |= ((uint32_t)data[i + 4] << 10) & 0x0000fc00;
- if(o--) {
- sum |= ((uint32_t)data[i + 5] << 2) & 0x00000300;
- sum |= ((uint32_t)data[i + 5] << 16) & 0x003f0000;
- }
- }
- }
- }
- }
- 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;
- }
- return encd;
-}
-
-LENDAT* decode(const uint8_t* data, const int32_t len) {
- LENDAT* decd = (LENDAT*)malloc(sizeof(LENDAT));
- int32_t outlen = len;
- uint8_t offset = 0;
- if(data[len-2] == '=') {
- offset = data[len-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;
- 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; i+=7) { //n实际每次自增2
- register uint32_t sum = 0;
- register uint32_t shift = htobe32(vals[n++]) - 0x4e004e00;
- shift <<= 2;
- sum |= shift & 0xfffc0000;
- shift <<= 2;
- sum |= shift & 0x0003fff0;
- shift = htobe32(vals[n++]) - 0x4e004e00;
- sum |= shift >> 26;
- *(uint32_t*)(decd->data+i) = be32toh(sum);
- sum = 0;
- shift <<= 6;
- sum |= shift & 0xffc00000;
- shift <<= 2;
- sum |= shift & 0x003fff00;
- *(uint32_t*)(decd->data+i+4) = be32toh(sum);
- }
- if(offset--) {
- //这里有读取越界
-#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--) {
- sum -= 0x004e0000;
- decd->data[i++] = ((sum & 0x00003f00) >> 6) | ((sum & 0x00300000) >> 20);
- if(offset--) {
- 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;
- if(offset--) {
- decd->data[i++] = ((sum & 0x00000003) << 6) | ((sum & 0x0000fc00) >> 10);
- if(offset--) {
- sum -= 0x004e0000;
- decd->data[i] = ((sum & 0x00000300) >> 2) | ((sum & 0x003f0000) >> 16);
- }
- }
- }
- }
- }
- }
- return decd;
-}
diff --git a/app/src/main/cpp/base14/32/base1432le.h b/app/src/main/cpp/base14/32/base1432le.h
deleted file mode 100644
index 2d1f7da..0000000
--- a/app/src/main/cpp/base14/32/base1432le.h
+++ /dev/null
@@ -1,13 +0,0 @@
-//base1432le.h
-//fumiama 20210408
-#include
-
-#define B14BUFSIZ 1024*1024 // 1M
-struct LENDAT {
- uint8_t* data;
- int32_t len;
-};
-typedef struct LENDAT LENDAT;
-
-LENDAT* encode(const uint8_t* data, const int32_t len);
-LENDAT* decode(const uint8_t* data, const int32_t len);
diff --git a/app/src/main/cpp/base14/64/CMakeLists.txt b/app/src/main/cpp/base14/64/CMakeLists.txt
deleted file mode 100644
index 71a0124..0000000
--- a/app/src/main/cpp/base14/64/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-cmake_minimum_required(VERSION 3.0.0)
-project(base1464 VERSION 2.0)
-SET(CMAKE_BUILD_TYPE "Release")
-
-add_library(base1464 STATIC base1464le.c)
diff --git a/app/src/main/cpp/base14/64/base1464le.c b/app/src/main/cpp/base14/64/base1464le.c
deleted file mode 100644
index 4cdf576..0000000
--- a/app/src/main/cpp/base14/64/base1464le.c
+++ /dev/null
@@ -1,170 +0,0 @@
-//base14.c
-//fumiama 20211029
-#include
-#include
-#if defined(__linux__)
-# include
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
-# include
-#elif defined(__OpenBSD__)
-# include
-# define be16toh(x) betoh16(x)
-# define be32toh(x) betoh32(x)
-# define be64toh(x) betoh64(x)
-#elif defined(__MAC_10_0)
-# 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
-#include "base1464le.h"
-
-//#define DEBUG
-
-LENDAT* encode(const uint8_t* data, const int64_t len) {
- LENDAT* encd = (LENDAT*)malloc(sizeof(LENDAT));
- int64_t outlen = len / 7 * 8;
- uint8_t offset = len % 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
- encd->data = (uint8_t*)malloc(outlen + 8); //冗余的8B用于可能的结尾的覆盖
- encd->len = outlen;
- uint64_t* vals = (uint64_t*)(encd->data);
- uint64_t n = 0;
- int64_t i = 0;
- for(; i <= len - 7; 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
- }
- uint8_t o = offset;
- if(o--) {
- register uint64_t sum = 0x000000000000003f & (data[i] >> 2);
- sum |= ((uint64_t)data[i] << 14) & 0x000000000000c000;
- if(o--) {
- sum |= ((uint64_t)data[i + 1] << 6) & 0x0000000000003f00;
- sum |= ((uint64_t)data[i + 1] << 20) & 0x0000000000300000;
- if(o--) {
- sum |= ((uint64_t)data[i + 2] << 12) & 0x00000000000f0000;
- sum |= ((uint64_t)data[i + 2] << 28) & 0x00000000f0000000;
- if(o--) {
- sum |= ((uint64_t)data[i + 3] << 20) & 0x000000000f000000;
- sum |= ((uint64_t)data[i + 3] << 34) & 0x0000003c00000000;
- if(o--) {
- sum |= ((uint64_t)data[i + 4] << 26) & 0x0000000300000000;
- sum |= ((uint64_t)data[i + 4] << 42) & 0x0000fc0000000000;
- if(o--) {
- sum |= ((uint64_t)data[i + 5] << 34) & 0x0000030000000000;
- sum |= ((uint64_t)data[i + 5] << 48) & 0x003f000000000000;
- }
- }
- }
- }
- }
- sum += 0x004e004e004e004e;
-#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
- encd->data[outlen - 2] = '=';
- encd->data[outlen - 1] = offset;
- }
- return encd;
-}
-
-LENDAT* decode(const uint8_t* data, const int64_t len) {
- LENDAT* decd = (LENDAT*)malloc(sizeof(LENDAT));
- int64_t outlen = len;
- uint8_t offset = 0;
- if(data[len-2] == '=') {
- offset = data[len-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;
- 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++, 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*)(decd->data+i) = be64toh(sum);
-#ifdef DEBUG
- printf("i: %llu, add sum: %016llx\n", i, sum);
-#endif
- }
- if(offset--) {
- //这里有读取越界
-#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;
- decd->data[i++] = ((sum & 0x0000000000003f00) >> 6) | ((sum & 0x0000000000300000) >> 20);
- if(offset--) {
- decd->data[i++] = ((sum & 0x00000000000f0000) >> 12) | ((sum & 0x00000000f0000000) >> 28);
- if(offset--) {
- sum -= 0x0000004e00000000;
- decd->data[i++] = ((sum & 0x000000000f000000) >> 20) | ((sum & 0x0000003c00000000) >> 34);
- if(offset--) {
- decd->data[i++] = ((sum & 0x0000000300000000) >> 26) | ((sum & 0x0000fc0000000000) >> 42);
- if(offset--) {
- sum -= 0x004e000000000000;
- decd->data[i] = ((sum & 0x0000030000000000) >> 34) | ((sum & 0x003f000000000000) >> 48);
- }
- }
- }
- }
- }
- }
- return decd;
-}
diff --git a/app/src/main/cpp/base14/64/base1464le.h b/app/src/main/cpp/base14/64/base1464le.h
deleted file mode 100644
index 9116eed..0000000
--- a/app/src/main/cpp/base14/64/base1464le.h
+++ /dev/null
@@ -1,13 +0,0 @@
-//base1464le.h
-//fumiama 20210408
-#include
-
-#define B14BUFSIZ 1024*1024 // 1M
-struct LENDAT {
- uint8_t* data;
- int64_t len;
-};
-typedef struct LENDAT LENDAT;
-
-LENDAT* encode(const uint8_t* data, const int64_t len);
-LENDAT* decode(const uint8_t* data, const int64_t len);
diff --git a/app/src/main/cpp/base14/CMakeLists.txt b/app/src/main/cpp/base14/CMakeLists.txt
index d465235..e3274b8 100644
--- a/app/src/main/cpp/base14/CMakeLists.txt
+++ b/app/src/main/cpp/base14/CMakeLists.txt
@@ -1,16 +1,15 @@
cmake_minimum_required(VERSION 3.10.2)
project("base16384")
-add_library(base14 SHARED base16384.cpp)
-add_library(base16384 STATIC base16384.c)
+include(TestBigEndian)
+test_big_endian(isBigEndian)
+if (${isBigEndian})
+ add_definitions(-DWORDS_BIGENDIAN)
+endif()
IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
- add_definitions("-DCPUBIT64")
- add_subdirectory("./64")
- target_link_libraries(base14 base16384 base1464)
+ add_library(base14 SHARED base16384.cpp file.c base1464.c)
ELSE()
- add_definitions("-DCPUBIT32")
- add_subdirectory("./32")
- target_link_libraries(base14 base16384 base1432)
+ add_library(base14 SHARED base16384.cpp file.c base1432.c)
ENDIF()
diff --git a/app/src/main/cpp/base14/LICENSE b/app/src/main/cpp/base14/LICENSE
new file mode 100755
index 0000000..f288702
--- /dev/null
+++ b/app/src/main/cpp/base14/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/app/src/main/cpp/base14/README.md b/app/src/main/cpp/base14/README.md
new file mode 100755
index 0000000..a518a61
--- /dev/null
+++ b/app/src/main/cpp/base14/README.md
@@ -0,0 +1,76 @@
+# base16384
+> **Note**: This project used the awesome cross-platform binary compiling tool [cosmopolitan](https://github.com/jart/cosmopolitan)
+
+> Alternatives: [Go](https://github.com/fumiama/go-base16384), [Python](https://github.com/synodriver/pybase16384), [Android](https://github.com/fumiama/android-base16384), [TypeScript](https://github.com/shigma/base16384.js), [Lua(binding)](https://github.com/synodriver/lua-base16384), [Lua(pure)](https://github.com/Yiwen-Chan/base16384), [C#](https://github.com/lc6464/Base16384Coder-Console)
+
+Encode binary file to printable utf16be, and vice versa.
+
+## Description 说明
+Use 16384 Chinene characters (from \u4E00 to \u8DFF) as the "alphabet", just like what base64 did.
+
+使用16384个汉字(从`\u4E00`到`\u8DFF`)作为字符表,就像base64用64个字符作为字符表一样。
+
+If length of the data has a remainder after moduled by 7, we will use \u3Dxx to log it with xx ranging from 01 to 06.
+
+使用`\u3Dxx`附加在末尾以表示编码时数据不满7位的个数,其范围在01~06。
+
+## Benefits 优点
+Save more space and since the code 0x0000 is encoded to "一", finding zero space seems to be easier.
+
+相较base64节省更多空间,更容易发现二进制文件的规律。
+
+## Usage 使用说明
+
+### Install from Debian sid 从Debian sid安装
+```bash
+sudo apt install base16384/unstable
+```
+
+### Install from my PPA in Ubuntu 从我的PPA安装
+```bash
+sudo add-apt-repository ppa:fumiama/ppa
+sudo apt-get update
+sudo apt-get install base16384
+```
+
+### Build from source code 编译
+
+Clone this repo first.
+
+首先克隆该仓库。
+
+```bash
+git clone https://github.com/fumiama/base16384.git
+cd base16384
+```
+
+Then use `cmake` to build.
+
+然后使用`cmake`进行构建。
+
+```bash
+mkdir build
+cd build
+cmake ..
+make
+make install
+```
+
+Now you can encode/decode a file by commands below.
+
+现在可以使用命令对文件进行编码/解码。
+
+```kotlin
+Usage: -[e|d]
+ -e encode
+ -d decode
+ pass - to read from stdin
+ pass - to write to stdout
+```
+
+## Examples 用例
+The text below is the encoding of the base16384.exe itself(MacOS Mojave version). It is clear to see the strucutre of the binary file.
+
+下面的文本是使用base16384程序编码自身(MacOS Mojave版本)的结果。可见文件结构十分清晰。
+
+臾糟蘜一乀縀倀倀一仰一亰佀丈戀渀一一乤一丒一丁浟成扴捩卒懀一一一一一一一一一一伀一一一一一一一一一一一一一一一一一一一丙一丂済一旗荄捡戀一一一一一一一丁一一亀一一一一一一一一丠一一一丅一一戀一侀一一一丗菷徕虴一一一一一丅譽扅搕一一一一一七渍一丐一仼冀一一一蘃帀丐一一一一一一一市一一一一一一一佽浳欝搧娀一一一一也旕剕潐一一一一一丷俀一伀一吀一一一不繰一乀一一一一一一嘄丠一一丆一一一一旗蔷忕灟栙擇侕耀一叵譑単挀一一一一一仰欀一帀丂縀一一一丼啀一嘀一一一一一一乀倀一一一一一一丅譽煳欜璖螜一一一丁浟挑掅帀一一一一一複帀丄一丌帐一一一峁舀一一一一一一一丈一一一一一一一一也旘蓶蟍舀一一一一丗菵引晔一一一一一丂乼一乀一俠一一一一渟一乐一一一一一一一一一一一一一一一叵试籷桛瑅讥籦槀一佽浔彖區一一一一一亘嗀一刀一栀一一一並俰一倀一一一一一一一一一一一一一一一最一嚀刀也旑刕弄一一一一一一倀一伀一丁亀一一一亀一一一一帀一一一儀一丰一丄一一一一旗蓦罽腹楘瓶罽繴檀叵謑佔幀一一一一一一渀一帀一嘀一一一一嘀一娀一一一一一丁渀一帀一一一一一丅譽畯欀一一一一一丁浟弐捄刀一一一一一倈一丄一丆一一一一亂一七一一一一一一丘一丄帀一一一一一也旛吕词蝭暛蓅证色丗菴弅扁一一一一一丂亀一乀一倀一一一一渠一丰一一一一一一俀一乐一一一一一一叵讍絭楛蓠一一一一佽浄幕刐一一一一一亠嘀一刀一儀倀一一一一一刀一一一一一一刀一一一一一一一一最一劀一也旓劔蜭卄恕一一一一儂一伀一丁一一一一什一一一僀匀一一一伀一丐一一一一一一嚀丈什一一儀一嘀一亃一丰一一一一一一仠縀为一一渱一娀一丂一丁渀一同渀乸一丢兀一瘁一亰一乐一一一一一一一一丂縀一夀一估一一一一一一一一一一一一一一一嶃娀两一一一一一一一一一一一尀一倀一丌一丂试腲姛咖嚽特椙一一一一侰一丘一与碹仔沖煑桒礅敽蒎籬耀一倀一丁一一丸堀七溠丄一一縀一一劀炠一丐一一一一一一亠一渆一丁縔一一一一一一一一儀一仠一丆一一倀一丟禐刀一市试腲姛咖嚽穩暔薗寑獭妐烦忥穩暀一一一垀一乀一丸儐一帀一傐一丐一丏仄一堀一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一丅挢埥怘諴澧侓園朤焇瘠买暜焇瘟繾帠唆嬄腀一一矁煃仸崇趃豁敱嬢嬕壀一伡焌炒丝嗿澃老瘼両毃滰予崀噝绠誀怏丈数蘼个净倗樶桃糿跿误跿跞跿跾槿跿螿跿跛跿跃翴丁捈灹曔槾凸佝耤瀴嬹一丄澌劁怀檏趂凇貺绘崟蛫倠詿膬冃翽皟焇蘟繺俐嗢埁繾常嶃蘩耣幀栏丁数葩八跿跴巿跿廿跿譟跿跕跿跽跿跿枋滱谐一一丆桁捈灹戕欅摁捐捅嬢俬琀一伦執恢淆栌购凡檀一么烁廑刀乌烊剓嗙瑁滏胐谗瀀一劈稗謐一勈竡宅跃虎瘀一慡浠谓笀一劘嗸伀刀仸薀一专嚞櫇萱縺嬐舀亅縃蛮訄一婿苈痚蠁一下爈一丐暜伔翉蠨绐丁嚃谿绸慜伀丒暜弥燆怚樉媑垒怰沂伐俰灰樞牿俸亀檈艳匀一丂畡侍企瘼凾凸佃虱訄一怣廛刄一怘繈匠俈跸嘼稛眇乀丄瀶荈跿跴耧痨权帀倗丏潖帐丁媋歪勘旘嶈愀帀伔翭析昳誴嶄喿跿謢嬵元渀伲埿蠼廀丁垉翓晟訾化跿跴瀴诵兀与瑨一专晞菔楈煍淠舀乌灹貌戰一恢橔瀗丏漆縐丂跾一丄耧賨窃一僿贀一勈痻皥儀丄耴荚刄丄瀴歃刀一詼亾乀一僫諿净勈痝媉衺噐縀么潰仸恰一专嚟氧呈灶禓漤怀蠈乐丁噣訮渐一么灷苈痧癝儀丄瀗乵簒囓萰嬀为呀縀仫朠訰熬嚃胁岰小儊滰羋跸一专嚟覠漌一姿言一愢淮湐娀专囒蓤崀专嚞欒埶愢沨畧皹伀丄澏纺乀一伲埯愢涞燘夀丒噜俒杌灹苈痛盲僀丄瀇劘一丅笅橁敐揤卽毃怣懛爰一衝跿跽嚍嵃绐七睫跿跴瀴講兀与獿跿跒囓蔬娀为挿跿赟跿践燻跿搿緿譫跿跖緿跽狿跿葢蘼涄一一丁璐捒嚞挅敁掐捔卑慈湻垀一么灼芘痱璃巋廸斌一丒嚰捴尀专嚲演翿枠膲舾叽一丄瀬华冀丄耬繍潽滸帔伀专晟訾刈乀丄琇贁丄一谷褀一勈疜翶婰岂嘬一潰仸蘜倀丌淴耧貺乀一僤倀一刘甁匱聺嵀瘀么滾巰谓稁一劈甍劉豰涑贇眝开涘産俸仠谟溧侃繄愜倀觾凥娄瀴詃怀樄性谩羓囒捴尐专嚞妡猈一劆巂蠁一丄耧界灼沉嘨一怡樀谑漁一劈畽媉趺嚠瘀仩敀帀伢宵怿跿謲埧蠦溠丂叀凡掀刀乌烟梄萗贏瀒縐丁匱襙瘳窴嶄仿跿謢嬵廂縀伢域蠉纠丁垉羓晟显叻趿跴瀴謫僀与爀伀专晞菔楈煍慀稀乌灹貏稤一恢橔瀗丏漄渐丁媉觺尐爀乌灻臟蘀一歁貍嘤一裁沀舨一愣懗縴一愣恘戴帀凇艀丂谁一下瘀丐专嚟謲埩蠭庐丁嚉绡殰谒戀一勈疿皐偀丈巠譵廓嚞趢儉一噜俑佈灶抌善湈粀一一伀一劀啅噣苐橠幜讍擀犌嗤湁瀁仾穡琮凇虀一一七翴丂埇愢泮瀰圀专嚟谧汌灸禑刀尀蠁买丁噣訮渐一乌灹苈症瘱偀丄瀗丏潖巿跽嚍嵗亠七瘴偀丄瀇劘一丅笅橁敐揤卽毃怣懞訤一裸劈苵嘊一岽欢嬽揂渀冯屈煏庠瘀仫罙滱謐一捒嚞挢凬划囗旂贆一与炘嘀丒妍竒蓗溷澴嬣蕭谒咔藃瘃一劈畁囁蠏芌嗨恈煁两渇噈滱伅蔍琮凇虀一一丙眅挢埥幕舕杍嚃褆嘿訐嶅蓀一伢埳怣敝烼吀一岄戠一愢藝漲奵蘒嚴娠嶾帀昿澐嶄猀一倏虥歃抈篬幈烜美渻裿跒嚴婡璃尋敆笢孵萯繠一仨亂一伢奍萓傟猢蛛嬭筸奸楃怽蓞伢埐怰沃謣俺劒囓縉嚺坲芒濴濤紓嚟伣藪怢欄焇瘿怰涡圠係怀歴澧翨什丄渇豈煏殠爀丱縺屰樀丱縒嘼幡楁斐揵蔍嚋泄劈篌曨姿巿謢奃吙瘳溴嶅楿跿趯摈煏彐爀仨篁縀伢嬽娂帀冢礇一劈苴紉一岉訜一怣懒蘤一蠤繰丁嚍嵒源七皇俀七嗿瘾俀三偂庐爤圉偂庐爒暝嬡燆愚欉媑垒恰沢伄俲弢欌喠流繾渤切偆煁子一一彊樤場刖滰巸巠卷垒囐蒴刀丒吰怅嘁耿谄吏嘆裄刘崀囫傐昼渓礄幠言睕嚉蝐捴卙佔拐帟堏哹凢什刀乌曽犘茸佈滾幫蘜一丐榐樀一愃苼猦凁跒妹媑垒園朢弲埈怽谴犧彉艺抐啅埁血犘崄佉滾幇圭嚃豁犀謿罈滱練瀧繈诸节留囑覒丝朣修互囐懔一一劂痁嘁谒嘼両娹萃虫瘄一恣幏嬢净倒冟渾咩乀七啈翀恮帀一一丿致瓼一一巳言义紀勠伸乎专瑠詾刀一一传崸訍佴瀧腈繺縤纇奈灼抌喤剌噾技略嚉諒娞稚俣一巳謠埋繻溈喛贿一劀畹威螒廳燄苃怠言匢凂俓冟基翫伌樃啉厅芃虁刄一凭滁欢城怰泠圢凡仒娞刹嘉詐昿瘄嶄芀一传嶾攅縔瀧汈繹湨喘丿一劀甹嚃蛀芌喌扈灶技病侃貀滸悐一丒任蝰攂怢毤焇琌湹渀丼么偳犈嶌嵈繸翄瀧杈偼战巨兴沒任蝰攃怢毤焇琔湹渀一嵈偳犈嶌嵈繸耤瀧杈偼战巨剴戒任蝰攄怢毤瀇瓀一丄焇琚怂櫤瀏焿怰氲眢埙怂洔吏蠅欉技賹戗佒嚝朢俦縀一伣俦嚒亜蜢凢巒娞囁嘉誒嚝匢衎专渄蘁尀怀檤琤拃恘訄唙刃趏托潐凿弢樅笅橁斐揵蔗虷结嚜漢几贒囕凱嚉艒娞爉嚃繀暜簏焁怡欠谓蠁一妠刀一怊檤渇案滰緼旵紅濁渀仇蓅赛给舘一缸痕牖舆一婎埵朝竁渀儓災摉椠昀仄蚟排蓄吀丱尧荤莰侀丌徉譙八繠七剢浖幚蘘一枋滱谐一一一詽一缸涖觿勢浖淼攗拸缐惗楋剢祤心舀一丱吢戃忄繉攽嘋匥蓶穌創臒伱忝綏剁坺诌愄歳芁穑蕯狄繋攽嘣匭蓵橄剷秒缐恞絋匭茵穆嚴仑缐旧詓臄繑歏甑伭殴穆墶弜嵀一七勢址嶜撵臗亱惝絋厥櫵繌抗槛缐惞絏厥櫵繬抗槜罱攽樣叅蓿橚斯跅祺跼攗拾缸牐凧勁涟藏媁嚃羂婌号拀怠訠嘾匫跿跴瀴担一一伢叛凡坐一仄虾擬贓災摲機敓仅譝窜憋莑匁帀一仅赛織昔一缸瓐儣叭櫴帬憉譙啔繐七叭蓴詞描弄缸痕犕圅一婞敯櫅襺謼斕臑侱尧荤猻佀丌斗槜罽攽刣勢浖恓刔一罽殼脗珫聱泞紧勢浖归帔一罽歌礓灵丰婌叹贄諒傜圤蟁凡戯臿跩籿巿贗譯佧乀一翶怣彌戀一丒噝稾匿跿跾絈崟业嶿跽櫻跿菏緿赢賿跶姯跿榾跿讘簏嗡一一一枤劆崙匱縠嗀淸譵嵑任蜐嗿幣戏谏蘅毋犈舷漁一劆娒佈乲巾倏哺裆昼槣礔滱緄哠伀一岰琏哶幮习一乕怢汔卝佖幕戕彎埰繾俼喠欁訢樜嗤冃蘾傜漊嬌丠訟琗圏瀢渀丁婣聑愞弦蠀耿穿褟資恮縀一一丿巴瓸一一巏言义緀丌凼崀一剓喴崟开丄瘼蛰唻芘苒案灼拂啥嚉諓借嬢嬌瑒嚟嬣俣伓借笠埋怰池标琀跏縄渧汊凎崓庉垃罀折崐啍屳嗫猐俀彡樇扟矴一丄拇筅婹剀唁厅縃虎嘀一悢臎谵嶲繺廨嶄再儮昜唣賿跐皀纉侃谀廸惸一丒囘賋趱跢櫬喸咁螿一丂埋繺罈嶌儉諐皅纈佁滾丠谒愀一嚜複簌湹紀一仁衇亟匊噌嚀爘巠兴氒妻姾翿穿跿謠俻灷稞虒俦言一伢埙怰沒堏漏偼戨漰瀃幠趀忑坈灶抌喤梁虰一丁囁裊瘾嫼埋庢参嘑侃谁敂漢螲跬添嗾翿怀櫴瀧蝈繺怨喇一一劌喼纃蟏纜謊噼嚁掴危佝幗爕護冐媿緿誣賿跊巯跼篾跿胟觿贽趿跿誔调一已挀儀丿联嘌一跉所娀仿坑渰七败怀縀凼獊什丏誕娃一已挸儀丿聕丌一跉挠娀仿坕丰七败掀縀凼獘什丏誕栃一已捰儀专囑蓴倀丐挿誗嬂一圆渀一为汯跿赨區一冧櫿跿蒂刀一衴緿跽瘮一与産跿跚冰一仩綿跿计嘀一岛懿跿栕帀七瞪跿跶澌一为栏跿赨槀一冦擿跿蒇舀一衣巿跽皉一与琋跿跚坰一仩氿跿订猀一岖觿跿栬渀七睤跿跶焄一为掯跿赨莀一冥廿跿艶提湦桛呒俍睺杈呗埉絲岈万殈乆槜呖蚁絵欜啗庁瑩椙怆揉聯檎瀀俉瀀徛蔆掸湩榜啗庁瑩椙怆揉聯檎瀀佝聩欙怆枥穥嘙攧垽耺嘀勷侕簠桛甇提湦桛呒侕聲槜熢丁孡樈咖蟁荴嘙璖羔湥檜瓷囨渀捜萖殔蠠奖著羑欠崚擧俕艦桛呓蚀詯歝唇揑瑩椙懠两筥嘙擦宽牥丂惖庁牥曛葆戀圼桛甇揑瑩椙懢亁繡櫜耂芁良嘜瑖厐湦檛蓒俍艤桛渀狱絵欜啗徙睬杏瀇侅腳嘋怇徼湷檚敆抁良嘜蕆徽荴东蔆掹爠欚擖拨渥椝擗娨一一一一一一一樀一一一丸一一一一挀一一一万侁幀娈伀凃滐縬堉倁繠成儂乀仰蘴娋傂庀一一一巳言一丿臰一一跏縀一仿巀一一一专渄蘁尀憇一一一一冀一一一一刀一唀一丈一三一一一一偀一丂一一一丁艖乐喀嬀丏一一言一寑縀一一七縀一什一丰丆三一嘀一一崀一佀侀三丘七舁縀妀娀乄庰帅漁什帀一一一一一一一一一一一一一一一一一乌啀一刀一掇帀丄一丘俐一伀一咡舀丁一万年一乀一俸欀一帀丂嘝一丐一互啀一刀一甇帀丄一丩濐一伀一夁舀丁一下癴一乀一儐欀一帀七尝一丐一付啀一刀一蚇帀丄一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一丁劈湠刀一久也旗蔷徑睮樀北嘢幀旗菷寑牯歝唀偁乤汛呅词艵暗萦玹牥檀圇嚀彀旘蓆讍祟柙敇徥筥两万嚠彀旙斆珐亐东焁匁浦柙敆娂帀檎伔佽瑯標擠偀乲帄戅讙繵欘縉丁聈剐叶柉獡最圀俉帑帗葧毉睴杀圀俉昑帗蓖莅縀爀唦久也楝擦莅縀爀唦湅也槜呖蘂帀檜伔佽繥檜瓷嘂帀檞伔佽繲桛畆昂帀檠丑匁浰歝唰偀乲瀀弔佽聥毚擦市帀檤丑匁浳欘敂弥屏弑慣市帀檦丑匁浵榙著後亐一一一佟丁帀捽筨旙斆掍荴杗蒆掅牥檀冶掹焀巙呖威畧杝号寑潲欗蓗娂栁楘撖蘂洁亀一一偯朙帄羉荦丬縐三洀挀塀刀偬杛渆垙睬杀圀刌仠哀一垽牥丝吧掘亮乀严訁言础帀垱獮丢縖枥穥严帐娃渜一縍乴七丠倰丌亠堀丰净瘀什夂稀儀縍帀娂湁丁下儅一一一一一蘆蘀参縅瘁挌上帊一剀蘀丘丁上縸一吀乀佰开丆一市樚一侀丐仄唀丁渀刀亀一丼伐一一一伀一你一丏傀上亀一乀一乸一七縐七业一丐一並一一訄一渄帀丄一丌縀一崁一吀蘀丁一七言一凂渀僀渐一帀丁唀一仰刀亰區一刀一懀一丼伀临仠一伀一叀一丏乀与临一乀一侠一七縐一渔一丐一乶一一訄一樅一丄一丟一一伀一帀一一一丈昀一乀一刀一一一丂开一丐一伀一一一一瘀一丄一乀一一一一塠一丁一丐一一一一傴一一帀丄一一一一亴一一刀丁一一一一丮縀一伀一帀一一一丌嘀一乀一刀一一一七堀一丐一伀一一一一舀一丄一乀一一一一宀一丁一丐一一一一典一一帀丄一一一一仦一一刀丁一一一一主渀一伀一帀一一一丏帀一乀一刀一一一七言一丐一伀一一一一傀帀丄一乀一一一一传刀丁一丐一一一一临一七渀一崀一伀一丑一丁嘀一勀一乐一丅帀一搀一佰一丘一丁爀一咀一乬一万一一一丐亰一丌一丁舀一兀一丸一七縀一帀一伐一丒一丁娀一匀一乔一丅渀一攀一侀一丙一丁瘀一哀一买一丈丅譽筨旙斆掍荴杗蒆掅牥檀叶徕煢歙清讑獣槙呐佽牥曛葆捽瑩椙帅讑獣槙呕讱獮丗葖融灵枀叶掹煯朙帅讕籣槙呕讙睬杀叶掹煯朙揶羕簀旙著彽腴晜畅讵脀旛搖玸也旗蔷徑睮樀叵譽腴望蕗忀也曛哶宭浧杝商玵猀旙斆珐也枙著後也枛蔆掸也果啗後也果瑖厐也枝蔦珑猀旛擖叀也楝擦莅縀旛蔆掸也標攧垽耀旜唦玹艦丗蔇揑脀旜瑗殥籤丗蔷待舤恓狴弔萴丗蕖螝獴曀呇玱牟櫝啖坽灩榙呗嘀一一一㴃
\ No newline at end of file
diff --git a/app/src/main/cpp/base14/base1432.c b/app/src/main/cpp/base14/base1432.c
new file mode 100755
index 0000000..6fa29e8
--- /dev/null
+++ b/app/src/main/cpp/base14/base1432.c
@@ -0,0 +1,212 @@
+/* base1432.c
+ * This file is part of the base16384 distribution (https://github.com/fumiama/base16384).
+ * Copyright (c) 2022 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
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#ifdef __cosmopolitan // always le
+# define be16toh(x) bswap_16(x)
+# define be32toh(x) bswap_32(x)
+# define htobe16(x) bswap_16(x)
+# define htobe32(x) bswap_32(x)
+#else
+#include
+#include
+#include
+#ifdef __linux__
+# include
+#endif
+#ifdef __FreeBSD__
+# include
+#endif
+#ifdef __NetBSD__
+# include
+#endif
+#ifdef __OpenBSD__
+# include
+# define be16toh(x) betoh16(x)
+# define be32toh(x) betoh32(x)
+#endif
+#ifdef __MAC_10_0
+# define be16toh(x) ntohs(x)
+# define be32toh(x) ntohl(x)
+# define htobe16(x) ntohs(x)
+# define htobe32(x) htonl(x)
+#endif
+#ifdef _WIN32
+ #ifdef WORDS_BIGENDIAN
+ # define be16toh(x) (x)
+ # define be32toh(x) (x)
+ # define htobe16(x) (x)
+ # define htobe32(x) (x)
+ #else
+ # define be16toh(x) _byteswap_ushort(x)
+ # define be32toh(x) _byteswap_ulong(x)
+ # define htobe16(x) _byteswap_ushort(x)
+ # define htobe32(x) _byteswap_ulong(x)
+ #endif
+#endif
+#endif
+
+// #define DEBUG
+
+int base16384_encode(const char* data, int dlen, char* buf, int blen) {
+ 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
+ uint32_t* vals = (uint32_t*)buf;
+ uint32_t n = 0;
+ int32_t i = 0;
+ for(; i <= dlen - 7; i += 7) {
+ register uint32_t sum = 0;
+ register uint32_t shift = htobe32(*(uint32_t*)(data+i));
+ sum |= (shift>>2) & 0x3fff0000;
+ sum |= (shift>>4) & 0x00003fff;
+ sum += 0x4e004e00;
+ vals[n++] = be32toh(sum);
+ shift <<= 26;
+ shift &= 0x3c000000;
+ sum = 0;
+ shift |= (htobe32(*(uint32_t*)(data+i+4))>>6)&0x03fffffc;
+ sum |= shift & 0x3fff0000;
+ shift >>= 2;
+ sum |= shift & 0x00003fff;
+ sum += 0x4e004e00;
+ vals[n++] = be32toh(sum);
+ }
+ uint8_t o = offset;
+ if(o--) {
+ register uint32_t sum = 0x0000003f & (data[i] >> 2);
+ sum |= ((uint32_t)data[i] << 14) & 0x0000c000;
+ if(o--) {
+ sum |= ((uint32_t)data[i + 1] << 6) & 0x00003f00;
+ sum |= ((uint32_t)data[i + 1] << 20) & 0x00300000;
+ if(o--) {
+ sum |= ((uint32_t)data[i + 2] << 12) & 0x000f0000;
+ sum |= ((uint32_t)data[i + 2] << 28) & 0xf0000000;
+ if(o--) {
+ sum |= ((uint32_t)data[i + 3] << 20) & 0x0f000000;
+ sum += 0x004e004e;
+ #ifdef WORDS_BIGENDIAN
+ 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;
+ sum |= ((uint32_t)data[i + 4] << 10) & 0x0000fc00;
+ if(o--) {
+ sum |= ((uint32_t)data[i + 5] << 2) & 0x00000300;
+ sum |= ((uint32_t)data[i + 5] << 16) & 0x003f0000;
+ }
+ }
+ }
+ }
+ }
+ sum += 0x004e004e;
+ #ifdef WORDS_BIGENDIAN
+ vals[n] = __builtin_bswap32(sum);
+ #else
+ vals[n] = sum;
+ #endif
+ buf[outlen - 2] = '=';
+ buf[outlen - 1] = offset;
+ }
+ return outlen;
+}
+
+int base16384_decode(const char* data, int dlen, char* buf, int blen) {
+ 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;
+ uint32_t* vals = (uint32_t*)data;
+ uint32_t n = 0;
+ int32_t i = 0;
+ for(; i <= outlen - 7; i+=7) { // n实际每次自增2
+ register uint32_t sum = 0;
+ register uint32_t shift = htobe32(vals[n++]) - 0x4e004e00;
+ shift <<= 2;
+ sum |= shift & 0xfffc0000;
+ shift <<= 2;
+ sum |= shift & 0x0003fff0;
+ shift = htobe32(vals[n++]) - 0x4e004e00;
+ sum |= shift >> 26;
+ *(uint32_t*)(buf+i) = be32toh(sum);
+ sum = 0;
+ shift <<= 6;
+ sum |= shift & 0xffc00000;
+ shift <<= 2;
+ sum |= shift & 0x003fff00;
+ *(uint32_t*)(buf+i+4) = be32toh(sum);
+ }
+ if(offset--) {
+ // 这里有读取越界
+ #ifdef WORDS_BIGENDIAN
+ register uint32_t sum = __builtin_bswap32(vals[n++]);
+ #else
+ register uint32_t sum = vals[n++];
+ #endif
+ sum -= 0x0000004e;
+ buf[i++] = ((sum & 0x0000003f) << 2) | ((sum & 0x0000c000) >> 14);
+ if(offset--) {
+ sum -= 0x004e0000;
+ buf[i++] = ((sum & 0x00003f00) >> 6) | ((sum & 0x00300000) >> 20);
+ if(offset--) {
+ buf[i++] = ((sum & 0x000f0000) >> 12) | ((sum & 0xf0000000) >> 28);
+ if(offset--) {
+ buf[i] = (sum & 0x0f000000) >> 20;
+ // 这里有读取越界
+ sum = vals[n];
+ sum -= 0x0000004e;
+ buf[i++] |= (sum & 0x0000003c) >> 2;
+ if(offset--) {
+ buf[i++] = ((sum & 0x00000003) << 6) | ((sum & 0x0000fc00) >> 10);
+ if(offset--) {
+ sum -= 0x004e0000;
+ buf[i] = ((sum & 0x00000300) >> 2) | ((sum & 0x003f0000) >> 16);
+ }
+ }
+ }
+ }
+ }
+ }
+ return outlen;
+}
diff --git a/app/src/main/cpp/base14/base1464.c b/app/src/main/cpp/base14/base1464.c
new file mode 100755
index 0000000..09f698b
--- /dev/null
+++ b/app/src/main/cpp/base14/base1464.c
@@ -0,0 +1,203 @@
+/* base1464.c
+ * This file is part of the base16384 distribution (https://github.com/fumiama/base16384).
+ * Copyright (c) 2022 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
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include
+#include
+#include
+#ifdef __linux__
+# include
+#endif
+#ifdef __FreeBSD__
+# include
+#endif
+#ifdef __NetBSD__
+# include
+#endif
+#ifdef __OpenBSD__
+# include
+# define be16toh(x) betoh16(x)
+# define be32toh(x) betoh32(x)
+# define be64toh(x) betoh64(x)
+#endif
+#ifdef __MAC_10_0
+# 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
+
+int base16384_encode(const char* data, int dlen, char* buf, int blen) {
+ 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 - 7; 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
+ }
+ int o = offset;
+ if(o--) {
+ register uint64_t sum = 0x000000000000003f & (data[i] >> 2);
+ sum |= ((uint64_t)data[i] << 14) & 0x000000000000c000;
+ if(o--) {
+ sum |= ((uint64_t)data[i + 1] << 6) & 0x0000000000003f00;
+ sum |= ((uint64_t)data[i + 1] << 20) & 0x0000000000300000;
+ if(o--) {
+ sum |= ((uint64_t)data[i + 2] << 12) & 0x00000000000f0000;
+ sum |= ((uint64_t)data[i + 2] << 28) & 0x00000000f0000000;
+ if(o--) {
+ sum |= ((uint64_t)data[i + 3] << 20) & 0x000000000f000000;
+ sum |= ((uint64_t)data[i + 3] << 34) & 0x0000003c00000000;
+ if(o--) {
+ sum |= ((uint64_t)data[i + 4] << 26) & 0x0000000300000000;
+ sum |= ((uint64_t)data[i + 4] << 42) & 0x0000fc0000000000;
+ if(o--) {
+ sum |= ((uint64_t)data[i + 5] << 34) & 0x0000030000000000;
+ sum |= ((uint64_t)data[i + 5] << 48) & 0x003f000000000000;
+ }
+ }
+ }
+ }
+ }
+ sum += 0x004e004e004e004e;
+ #ifdef WORDS_BIGENDIAN
+ vals[n] = __builtin_bswap64(sum);
+ #else
+ vals[n] = sum;
+ #endif
+ #ifdef DEBUG
+ printf("i: %llu, add sum: %016llx\n", i, sum);
+ #endif
+ buf[outlen - 2] = '=';
+ buf[outlen - 1] = offset;
+ }
+ return outlen;
+}
+
+int base16384_decode(const char* data, int dlen, char* buf, int blen) {
+ 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
+ }
+ if(offset--) {
+ // 这里有读取越界
+ #ifdef WORDS_BIGENDIAN
+ register uint64_t sum = __builtin_bswap64(vals[n]) - 0x000000000000004e;
+ #else
+ register uint64_t sum = vals[n] - 0x000000000000004e;
+ #endif
+ buf[i++] = ((sum & 0x000000000000003f) << 2) | ((sum & 0x000000000000c000) >> 14);
+ if(offset--) {
+ sum -= 0x00000000004e0000;
+ buf[i++] = ((sum & 0x0000000000003f00) >> 6) | ((sum & 0x0000000000300000) >> 20);
+ if(offset--) {
+ buf[i++] = ((sum & 0x00000000000f0000) >> 12) | ((sum & 0x00000000f0000000) >> 28);
+ if(offset--) {
+ sum -= 0x0000004e00000000;
+ buf[i++] = ((sum & 0x000000000f000000) >> 20) | ((sum & 0x0000003c00000000) >> 34);
+ if(offset--) {
+ buf[i++] = ((sum & 0x0000000300000000) >> 26) | ((sum & 0x0000fc0000000000) >> 42);
+ if(offset--) {
+ sum -= 0x004e000000000000;
+ buf[i] = ((sum & 0x0000030000000000) >> 34) | ((sum & 0x003f000000000000) >> 48);
+ }
+ }
+ }
+ }
+ }
+ }
+ return outlen;
+}
diff --git a/app/src/main/cpp/base14/base16384.c b/app/src/main/cpp/base14/base16384.c
deleted file mode 100644
index 25d3dec..0000000
--- a/app/src/main/cpp/base14/base16384.c
+++ /dev/null
@@ -1,100 +0,0 @@
-#include
-#include
-#include "base16384.h"
-
-int 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;
- fputc(0xFE, fpo);
- fputc(0xFF, fpo);
- fflush(fpo);
- while((cnt = fread(bufi, sizeof(char), B14BUFSIZ/7*7, fp))) {
- LENDAT* ld = encode(bufi, cnt);
- if(fwrite(ld->data, ld->len, 1, fpo) <= 0) {
- puts("Write file error!");
- return 1;
- }
- free(ld->data);
- free(ld);
- }
- free(bufi);
- } else {
- puts("Allocate input buffer error!");
- return 2;
- }
- fclose(fpo);
- } else {
- puts("Open output file error!");
- return 3;
- }
- fclose(fp);
- return 0;
- } else {
- puts("Open input file error!");
- return 4;
- }
-}
-
-void rm_head(FILE* fp) {
- int ch = fgetc(fp);
- if(ch == 0xFE) fgetc(fp);
- else rewind(fp);
-}
-
-static int is_next_end(FILE* fp) {
- int ch = fgetc(fp);
- if(ch == '=') return fgetc(fp);
- else {
- ungetc(ch, fp);
- return 0;
- }
-}
-
-int 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 + 2); //+2避免漏检结束偏移标志
- if(bufi) {
- int cnt, end;
- rm_head(fp);
- while((cnt = fread(bufi, sizeof(char), B14BUFSIZ/8*8, fp))) {
- if((end = is_next_end(fp))) {
- bufi[cnt++] = '=';
- bufi[cnt++] = (char)end;
- }
- LENDAT* ld = decode(bufi, cnt);
- if(fwrite(ld->data, ld->len, 1, fpo) <= 0) {
- puts("Write file error!");
- return 1;
- }
- free(ld->data);
- free(ld);
- }
- free(bufi);
- } else {
- puts("Allocate input buffer error!");
- return 2;
- }
- fclose(fpo);
- } else {
- puts("Open output file error!");
- return 3;
- }
- fclose(fp);
- return 0;
- } else {
- puts("Open input file error!");
- return 4;
- }
-}
diff --git a/app/src/main/cpp/base14/base16384.cpp b/app/src/main/cpp/base14/base16384.cpp
index e7b85b5..2317fa6 100644
--- a/app/src/main/cpp/base14/base16384.cpp
+++ b/app/src/main/cpp/base14/base16384.cpp
@@ -6,32 +6,36 @@
#define execute(function){\
const char *inputFileDir = env->GetStringUTFChars(sf, JNI_FALSE);\
- const char *outputFileDir = env->GetStringUTFChars(df, JNI_FALSE);\
- int re = function(inputFileDir, outputFileDir);\
+ const char *outputFileDir = env->GetStringUTFChars(df, JNI_FALSE); \
+ char* encbuf = (char*)malloc(BASE16384_ENCBUFSZ); \
+ char* decbuf = (char*)malloc(BASE16384_DECBUFSZ); \
+ int re = function(inputFileDir, outputFileDir, encbuf, decbuf); \
+ free(encbuf); free(decbuf); \
env->ReleaseStringUTFChars(sf, inputFileDir);\
env->ReleaseStringUTFChars(df, outputFileDir);\
return re;\
}
-#define exe_byte(fun) {\
+#define exe_byte(x) {\
jsize len = env->GetArrayLength(buf);\
- const uint8_t* data = (uint8_t*)env->GetByteArrayElements(buf, JNI_FALSE);\
- LENDAT* ld = fun(data, len);\
- jbyteArray out = env->NewByteArray(ld->len);\
- env->SetByteArrayRegion(out, 0, ld->len, reinterpret_cast(ld->data));\
- free(ld->data);\
- free(ld);\
+ const char* data = (char*)env->GetByteArrayElements(buf, JNI_FALSE);\
+ int x##len = base16384_##x##_len(len) + 64;\
+ char* x##buf = (char*) malloc(x##len);\
+ x##len = base16384_##x(data, len, x##buf, x##len);\
+ jbyteArray out = env->NewByteArray(x##len);\
+ env->SetByteArrayRegion(out, 0, x##len, reinterpret_cast(x##buf));\
+ free(x##buf);\
return out;\
}
extern "C" JNIEXPORT int JNICALL
-Java_top_fumiama_base16384_MainActivity_encode(JNIEnv* env, jobject, jstring sf, jstring df) execute(encode_file)
+Java_top_fumiama_base16384_MainActivity_encode(JNIEnv* env, jobject, jstring sf, jstring df) execute(base16384_encode_file)
extern "C" JNIEXPORT int JNICALL
-Java_top_fumiama_base16384_MainActivity_decode(JNIEnv* env, jobject, jstring sf, jstring df) execute(decode_file)
+Java_top_fumiama_base16384_MainActivity_decode(JNIEnv* env, jobject, jstring sf, jstring df) execute(base16384_decode_file)
extern "C" JNIEXPORT jbyteArray JNICALL
Java_top_fumiama_base16384_MainActivity_encodeByteArray(JNIEnv* env, jobject, jbyteArray buf) exe_byte(encode)
extern "C" JNIEXPORT jbyteArray JNICALL
-Java_top_fumiama_base16384_MainActivity_decodeByteArray(JNIEnv* env, jobject, jbyteArray buf) exe_byte(decode)
\ No newline at end of file
+Java_top_fumiama_base16384_MainActivity_decodeByteArray(JNIEnv* env, jobject, jbyteArray buf) exe_byte(decode)
diff --git a/app/src/main/cpp/base14/base16384.h b/app/src/main/cpp/base14/base16384.h
old mode 100644
new mode 100755
index 67f17a3..3c0d6af
--- a/app/src/main/cpp/base14/base16384.h
+++ b/app/src/main/cpp/base14/base16384.h
@@ -1,11 +1,66 @@
-#ifndef CPUBIT32
- #ifndef CPUBIT64
- #define CPUBIT32
- #endif
+#ifndef _BASE16384_H_
+#define _BASE16384_H_
+
+/* base16384.h
+ * This file is part of the base16384 distribution (https://github.com/fumiama/base16384).
+ * Copyright (c) 2022 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
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef __cosmopolitan
+#include
+#include
#endif
-#ifdef CPUBIT32
- #include "./32/base1432le.h"
-#endif
-#ifdef CPUBIT64
- #include "./64/base1464le.h"
+
+// base16384_err_t is the return value of base16384_en/decode_file
+enum base16384_err_t {
+ base16384_err_ok,
+ base16384_err_get_file_size,
+ base16384_err_fopen_output_file,
+ base16384_err_fopen_input_file,
+ base16384_err_write_file,
+ base16384_err_open_input_file,
+ base16384_err_map_input_file,
+ base16384_err_read_file,
+};
+// base16384_err_t is the return value of base16384_en/decode_file
+typedef enum base16384_err_t base16384_err_t;
+
+#define BASE16384_ENCBUFSZ (BUFSIZ*1024/7*7)
+#define BASE16384_DECBUFSZ (BUFSIZ*1024/8*8+2)
+
+// base16384_encode_len calc min buf size to fill encode result
+static inline int base16384_encode_len(int dlen) {
+ 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;
+ }
+ return outlen + 8; // 冗余的8B用于可能的结尾的覆盖
+}
+
+// base16384_decode_len calc min buf size to fill decode result
+static inline int base16384_decode_len(int dlen) {
+ return dlen / 8 * 7 + 1; // 多出1字节用于循环覆盖
+}
+
#endif
diff --git a/app/src/main/cpp/base14/base16384.hpp b/app/src/main/cpp/base14/base16384.hpp
index c35de4c..215030a 100644
--- a/app/src/main/cpp/base14/base16384.hpp
+++ b/app/src/main/cpp/base14/base16384.hpp
@@ -5,36 +5,22 @@
#ifndef BASE16384_BASE16384_HPP
#define BASE16384_BASE16384_HPP
#include
+#include "base16384.h"
-#ifndef CPUBIT32
- #ifndef CPUBIT64
- #define CPUBIT32
- #endif
-#endif
-#ifdef CPUBIT32
-#define B14BUFSIZ 8192
-struct LENDAT {
- uint8_t* data;
- uint32_t len;
-};
-typedef struct LENDAT LENDAT;
+// base16384_encode encodes data and write result into buf
+extern "C" int base16384_encode(const char* data, int dlen, char* buf, int blen);
-extern "C" LENDAT* encode(const uint8_t* data, const uint32_t len);
-extern "C" LENDAT* decode(const uint8_t* data, const uint32_t len);
-#endif
-#ifdef CPUBIT64
-#define B14BUFSIZ 16384
-struct LENDAT {
- uint8_t* data;
- uint64_t len;
-};
-typedef struct LENDAT LENDAT;
+// base16384_decode decodes data and write result into buf
+extern "C" int base16384_decode(const char* data, int dlen, char* buf, int blen);
-extern "C" LENDAT* encode(const uint8_t* data, const uint64_t len);
-extern "C" LENDAT* decode(const uint8_t* data, const uint64_t len);
-#endif
+// base16384_encode_file encodes input file to output file.
+// use `-` to specify stdin/stdout
+// encbuf & decbuf must be no less than BASE16384_ENCBUFSZ & BASE16384_DECBUFSZ
+extern "C" base16384_err_t base16384_encode_file(const char* input, const char* output, char* encbuf, char* decbuf);
-extern "C" int encode_file(const char* input, const char* output);
-extern "C" int decode_file(const char* input, const char* output);
+// base16384_decode_file decodes input file to output file.
+// use `-` to specify stdin/stdout
+// encbuf & decbuf must be no less than BASE16384_ENCBUFSZ & BASE16384_DECBUFSZ
+extern "C" base16384_err_t base16384_decode_file(const char* input, const char* output, char* encbuf, char* decbuf);
#endif //BASE16384_BASE16384_HPP
diff --git a/app/src/main/cpp/base14/file.c b/app/src/main/cpp/base14/file.c
new file mode 100755
index 0000000..ee6aee4
--- /dev/null
+++ b/app/src/main/cpp/base14/file.c
@@ -0,0 +1,183 @@
+/* file.c
+ * This file is part of the base16384 distribution (https://github.com/fumiama/base16384).
+ * Copyright (c) 2022 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
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef __cosmopolitan
+#include
+#include
+#include
+#include
+#include
+#ifdef _WIN32
+ #include
+ #include
+ #include
+#else
+ #include
+ #include
+#endif
+#endif
+#include "base16384.h"
+
+#ifdef __cosmopolitan
+#define get_file_size(filepath) ((off_t)GetFileSize(filepath))
+#else
+static inline off_t get_file_size(const char* filepath) {
+ struct stat statbuf;
+ return stat(filepath, &statbuf)?-1:statbuf.st_size;
+}
+#endif
+
+base16384_err_t base16384_encode_file(const char* input, const char* output, char* encbuf, char* decbuf) {
+ off_t inputsize;
+ FILE* fp = NULL;
+ FILE* fpo;
+ if(*(uint16_t*)input == *(uint16_t*)"-") { // read from stdin
+ inputsize = 0;
+ fp = stdin;
+ } else inputsize = get_file_size(input);
+ if(inputsize < 0) {
+ return base16384_err_get_file_size;
+ }
+ fpo = (*(uint16_t*)output == *(uint16_t*)"-")?stdout:fopen(output, "wb");
+ if(!fpo) {
+ return base16384_err_fopen_output_file;
+ }
+ if(!inputsize || inputsize > BUFSIZ*1024) { // stdin or big file, use encbuf & fread
+ inputsize = BUFSIZ*1024/7*7;
+ #ifdef _WIN32
+ }
+ #endif
+ if(!fp) fp = fopen(input, "rb");
+ if(!fp) {
+ return base16384_err_fopen_input_file;
+ }
+
+ int outputsize = base16384_encode_len(inputsize)+16;
+ size_t cnt = 0;
+ fputc(0xFE, fpo);
+ fputc(0xFF, fpo);
+ while((cnt = fread(encbuf, sizeof(char), inputsize, fp)) > 0) {
+ int n = base16384_encode(encbuf, cnt, decbuf, outputsize);
+ if(fwrite(decbuf, n, 1, fpo) <= 0) {
+ return base16384_err_write_file;
+ }
+ }
+ fclose(fpo);
+ fclose(fp);
+ #ifndef _WIN32
+ } else { // small file, use mmap & fwrite
+ int fd = open(input, O_RDONLY);
+ if(fd <= 0) {
+ return base16384_err_open_input_file;
+ }
+ char *input_file = mmap(NULL, (size_t)inputsize, PROT_READ, MAP_PRIVATE, fd, 0);
+ if(input_file == MAP_FAILED) {
+ return base16384_err_map_input_file;
+ }
+ int outputsize = base16384_encode_len(inputsize)+16;
+ fputc(0xFE, fpo);
+ fputc(0xFF, fpo);
+ int n = base16384_encode(input_file, (int)inputsize, decbuf, outputsize);
+ if(fwrite(decbuf, n, 1, fpo) <= 0) {
+ return base16384_err_write_file;
+ }
+ munmap(input_file, (size_t)inputsize);
+ fclose(fpo);
+ close(fd);
+ }
+ #endif
+ return base16384_err_ok;
+}
+
+#define rm_head(fp) {\
+ int ch = fgetc(fp);\
+ if(ch == 0xFE) fgetc(fp);\
+ else rewind(fp);\
+}
+
+#define skip_offset(input_file) ((input_file[0]==(char)0xFE)?2:0)
+
+static inline int is_next_end(FILE* fp) {
+ int ch = fgetc(fp);
+ if(ch == EOF) return 0;
+ if(ch == '=') return fgetc(fp);
+ ungetc(ch, fp);
+ return 0;
+}
+
+base16384_err_t base16384_decode_file(const char* input, const char* output, char* encbuf, char* decbuf) {
+ off_t inputsize;
+ FILE* fp = NULL;
+ FILE* fpo;
+ if(*(uint16_t*)input == *(uint16_t*)"-") { // read from stdin
+ inputsize = 0;
+ fp = stdin;
+ } else inputsize = get_file_size(input);
+ if(inputsize < 0) {
+ return base16384_err_get_file_size;
+ }
+ fpo = (*(uint16_t*)output == *(uint16_t*)"-")?stdout:fopen(output, "wb");
+ if(!fpo) {
+ return base16384_err_fopen_output_file;
+ }
+ if(!inputsize || inputsize > BUFSIZ*1024) { // stdin or big file, use decbuf & fread
+ inputsize = BUFSIZ*1024/8*8;
+ #ifdef _WIN32
+ }
+ #endif
+ if(!fp) fp = fopen(input, "rb");
+ if(!fp) {
+ return base16384_err_fopen_input_file;
+ }
+ int outputsize = base16384_decode_len(inputsize)+16;
+ int cnt = 0;
+ int end = 0;
+ rm_head(fp);
+ while((cnt = fread(decbuf, sizeof(char), inputsize, fp)) > 0) {
+ if((end = is_next_end(fp))) {
+ decbuf[cnt++] = '=';
+ decbuf[cnt++] = end;
+ }
+ if(fwrite(encbuf, base16384_decode(decbuf, cnt, encbuf, outputsize), 1, fpo) <= 0) {
+ return base16384_err_write_file;
+ }
+ }
+ fclose(fpo);
+ fclose(fp);
+ #ifndef _WIN32
+ } else { // small file, use mmap & fwrite
+ int fd = open(input, O_RDONLY);
+ if(fd <= 0) {
+ return base16384_err_open_input_file;
+ }
+ char *input_file = mmap(NULL, (size_t)inputsize, PROT_READ, MAP_PRIVATE, fd, 0);
+ if(input_file == MAP_FAILED) {
+ return base16384_err_map_input_file;
+ }
+ int outputsize = base16384_decode_len(inputsize)+16;
+ int off = skip_offset(input_file);
+ if(fwrite(encbuf, base16384_decode(input_file+off, inputsize-off, encbuf, outputsize), 1, fpo) <= 0) {
+ return base16384_err_write_file;
+ }
+ munmap(input_file, (size_t)inputsize);
+ fclose(fpo);
+ close(fd);
+ }
+ #endif
+ return base16384_err_ok;
+}