ysf/ysf.cpp
2024-09-07 22:48:30 +09:00

1136 lines
28 KiB
C++

/*<8>
0〜7=1Bytes
8〜11=2Bytes
12〜16=3Bytes
17〜21=4Bytes
22〜25=5Bytes
26〜31=6Bytes
32〜∞=7Bytes~
32〜32=7Bytes
33〜38=8Bytes
39〜44=9Bytes
45〜50=10Bytes
51〜56=11Bytes
57〜62=12Bytes
63〜68=13Bytes
... to ∞
<16A>
0x0000〜0xD7FF=2Bytes
0xD800〜0xDFFF=4Bytes
0xE000〜0xFFFF=2Bytes
0x10000〜0x7FFFFFFF=8Bytes
0x80000000〜0x87FFFFFF=6Bytes
0x1080000000〜0x20007FFFFFF=8Bytes
0x200080000000〜0x4020007FFFFFFF=10Bytes
... to ∞
<16B>
0000〜D7FD=2Bytes
D7FE〜D7FF=6Bytes
D800〜DFFF=6Bytes
E000〜FFFF=2Bytes
10000〜10FFFF=4Bytes
110000〜20FFFF=8Bytes
210000〜4020FFFF=10Bytes
40210000〜1004020FFFF=12Bytes
10040210000〜401004020FFFF=14Bytes
... to ∞
0000~D7FD :単独
D7FE :D7FE,D7FF,110000~
D7FF :不正
D800~DBFF :10000~10FFFF
DC00~DFFF :不正
E000~FFFF :単独
<32>
0〜31=4Bytes
32〜58=8Bytes
59〜88=12Bytes
89〜118=16Bytes
... to ∞
<7>
0x00〜0x25=1Bytes
0x26=2Bytes
0x27〜0x7F=1Bytes
0x80〜∞=3Bytes〜*/
#include <vector>
#include <iostream>
#include <string>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/random.hpp>
#include <ctime>
using namespace std;
using namespace boost::multiprecision;
using namespace boost::random;
typedef vector<unsigned char> bytes;
typedef vector<cpp_int> codepoint;
typedef number<cpp_dec_float<1000,int64_t>> bigfloat;
int rnd = time(nullptr);
/* 乱数関連ここから */
cpp_int random(int k){
cpp_int r;
rnd ++;
boost::random::mt19937 gen(rnd);
boost::random::uniform_int_distribution<cpp_int> dist(0, cpp_int(1) << k);
r = dist(gen);
return r;
}
/* 乱数関連ここまで */
cpp_int keta(cpp_int a){
cpp_int i = 0;
while (a > 1){
a /= 2;
i++;
}
return i;
}
codepoint eight2vec(bytes s){
int i = 0;
codepoint v;
while (i < s.size()){
if (s[i] < 0x80){
//1
v.push_back(s[i]);
i++;
}else if (s[i] < 0xC2){
v.push_back(-1);
i++;
}else if (s[i] < 0xE0){
//2
v.push_back((s[i]-0xC0)*0x40+s[i+1]-0x80);
i+=2;
}else if (s[i] < 0xF0){
//3
v.push_back((s[i]-0xE0)*0x1000+(s[i+1]-0x80)*0x40+s[i+2]-0x80);
i+=3;
}else if (s[i] < 0xF8){
//4
v.push_back((s[i]-0xF0)*0x40000+(s[i+1]-0x80)*0x1000+(s[i+2]-0x80)*0x40+s[i+3]-0x80);
i+=4;
}else if (s[i] <= 0xF9){
//5
v.push_back((s[i]-0xF8)*0x1000000+(s[i+1]-0x80)*0x40000+(s[i+2]-0x80)*0x1000+(s[i+3]-0x80)*0x40+s[i+4]-0x80);
i+=5;
}else if (s[i] <= 0xFB){
//6
v.push_back((s[i]-0xFA)*0x40000000+(s[i+1]-0x80)*0x1000000+(s[i+2]-0x80)*0x40000+(s[i+3]-0x80)*0x1000+(s[i+4]-0x80)*0x40+s[i+5]-0x80);
i+=6;
}else if (s[i] <= 0xFD){
//7+
cpp_int w = s[i]-0xFC;
for (int j=1;j<s.size()-i;j++){
if (s[i+j]>=0x80 && s[i+j]<0xC0){
w *= 0x40;
w += s[i+j]-0x80;
}else if (s[i+j]==0xC0 || s[i+j]==0xC1){
w *= 0x2;
w += s[i+j]-0xC0;
i += j+1;
break;
}else{
//Err
v.push_back(-1);
i += j+1;
break;
}
}
// w += 0x80000000;
v.push_back(w);
}else{
v.push_back(-1);
i++;
break;
}
}
return v;
}
bytes vec2eight(codepoint v){
bytes b;
cpp_int k = 0;
for (int i=0;i<v.size();i++){
if (v[i]<0x00){
continue;
}else if (v[i] < 0x80){
b.push_back((unsigned char)(v[i]));
}else if (v[i] < 0x800){
b.push_back((unsigned char)(v[i]/0x40+0xC0));
b.push_back((unsigned char)(v[i]%0x40+0x80));
}else if (v[i] < 0x10000){
b.push_back((unsigned char)(v[i]/0x1000+0xE0));
b.push_back((unsigned char)(v[i]/0x40%0x40+0x80));
b.push_back((unsigned char)(v[i]%0x40+0x80));
}else if (v[i] < 0x200000){
b.push_back((unsigned char)(v[i]/0x40000+0xF0));
b.push_back((unsigned char)(v[i]/0x1000%0x40+0x80));
b.push_back((unsigned char)(v[i]/0x40%0x40+0x80));
b.push_back((unsigned char)(v[i]%0x40+0x80));
}else if (v[i] < 0x2000000){
b.push_back((unsigned char)(v[i]/0x1000000+0xF8));
b.push_back((unsigned char)(v[i]/0x40000%0x40+0x80));
b.push_back((unsigned char)(v[i]/0x1000%0x40+0x80));
b.push_back((unsigned char)(v[i]/0x40%0x40+0x80));
b.push_back((unsigned char)(v[i]%0x40+0x80));
}else if (v[i] < 0x80000000){
b.push_back((unsigned char)(v[i]/0x40000000+0xFA));
b.push_back((unsigned char)(v[i]/0x1000000%0x40+0x80));
b.push_back((unsigned char)(v[i]/0x40000%0x40+0x80));
b.push_back((unsigned char)(v[i]/0x1000%0x40+0x80));
b.push_back((unsigned char)(v[i]/0x40%0x40+0x80));
b.push_back((unsigned char)(v[i]%0x40+0x80));
}else{
// k = keta(v[i] - 0x80000000);
k = v[i];
cpp_int j = 2;
// cpp_int p = (v[i] - 0x80000000)/2;
cpp_int p = v[i]/2;
while (true){
if (k >= j && k < j+6){
if (k == j+5){
b.push_back((unsigned char)(0xFC + (p/(cpp_int(1) << int(k)))));
p = p % (cpp_int(1) << int(k));
}else{
b.push_back((unsigned char)(0xFC));
}
bytes b2;
while (p >= 1){
b2.insert(b2.begin(),(unsigned char)(p%0x40+0x80));
p /= 0x40;
}
b2.push_back((unsigned char)(v[i]%2+0xC0));
b.insert(b.end(), b2.begin(), b2.end());//移し
break;
}
j += 6;
}
}
}
return b;
}
codepoint sixteenABE2vec(bytes s){
int i = 0;
codepoint v;
cpp_int k;
cpp_int l;
while (i < s.size()){
k = s[i]*0x100+s[i+1];
if (k <= 0xD7FF || k>= 0xE000){
v.push_back(k);
i += 2;
}else if (k >= 0xD800 && k <= 0xD87F){
l = (k-0xD800)*0x10;
k = s[i+2]*0x100 + s[i+3];
if (k >= 0xDFF0 && k <= 0xDFFF){
l += (k - 0xDFF0) + 0xD800;
v.push_back(l);
i += 4;
}else{
//Err
v.push_back(-1);
i += 4;
}
}else if (k >= 0xD880 && k <= 0xD8FF){
l = (k-0xD880)*0x1000000;
k = s[i+2]*0x100+s[i+3];
if (k < 0xD900 || k > 0xD9FF){
//Err
v.push_back(-1);
i += 8;
continue;
}
l += (k-0xD900)*0x10000;
k = s[i+4]*0x100+s[i+5];
if (k < 0xDA00 || k > 0xDAFF){
//Err
v.push_back(-1);
i += 8;
continue;
}
l += (k-0xDA00)*0x100;
k = s[i+6]*0x100+s[i+7];
if (k < 0xDB00 || k > 0xDBFF){
//Err
v.push_back(-1);
i += 8;
continue;
}
l += (k-0xDB00);
l += 0x10000;
v.push_back(l);
i += 8;
}else if (k >= 0xDC00 && k <= 0xDDFF){
l = k-0xDC00;
for (int j=2;i+j<s.size();j+=2){
k = s[i+j]*0x100+s[i+j+1];
if (k >= 0xD900 && k <= 0xDAFF){
l *= 0x200;
l += k-0xD900;
}else if (k >= 0xDE00 && k <= 0xDFFF){
l *= 0x200;
l += k-0xDE00;
l += 0x80000000;
v.push_back(l);
i += j+2;
break;
}else{
v.push_back(-1);
i += j+2;
break;
}
}
}else{
v.push_back(-1);
i+=2;
}
}
return v;
}
bytes vec2sixteenABE(codepoint v){
bytes b;
cpp_int k = 0;
for (int i=0;i<v.size();i++){
if (v[i]<0){
continue;
}else if (v[i] <= 0xD7FF || (v[i] >= 0xE000 && v[i] <= 0xFFFF)){
b.push_back((unsigned char)(v[i]/0x100));
b.push_back((unsigned char)(v[i]%0x100));
}else if (v[i] >= 0xD800 && v[i] <= 0xDFFF){
b.push_back((unsigned char)(0xD8));
b.push_back((unsigned char)((v[i]-0xD800)/0x10 % 0x80));
b.push_back((unsigned char)(0xDF));
b.push_back((unsigned char)((v[i]-0xD800)%0x10 + 0xF0));
}else if (v[i] >= 0x10000 && v[i] <= 0x7FFFFFFF){
b.push_back((unsigned char)(0xD8));
b.push_back((unsigned char)((v[i]-0x10000)/0x1000000%0x100 + 0x80));
b.push_back((unsigned char)(0xD9));
b.push_back((unsigned char)((v[i]-0x10000)/0x10000%0x100));
b.push_back((unsigned char)(0xDA));
b.push_back((unsigned char)((v[i]-0x10000)/0x100%0x100));
b.push_back((unsigned char)(0xDB));
b.push_back((unsigned char)((v[i]-0x10000)%0x100));
}else{
k = keta(v[i] - 0x80000000);
cpp_int j = 0;
cpp_int p = 0;
while (true){
if (k >= j && k < j+9){
p = v[i] - 0x80000000;
bytes b2;
b2.insert(b2.begin(),(unsigned char)(p%0x200/0x100+0xDE));
b2.insert(b2.begin()+1,(unsigned char)(p%0x100));
p /= 0x200;
do{
b2.insert(b2.begin(),(unsigned char)(p%0x200/0x100+0xD9));
b2.insert(b2.begin()+1,(unsigned char)(p%0x100));
p /= 0x200;
}while (p >= 1);
b2[0] += 0x03;
b.insert(b.end(), b2.begin(), b2.end());//移し
break;
}
j += 9;
}
}
}
return b;
}
codepoint sixteenALE2vec(bytes s){
int i = 0;
codepoint v;
cpp_int k;
cpp_int l;
while (i < s.size()){
k = s[i+1]*0x100+s[i];
if (k <= 0xD7FF || k>= 0xE000){
v.push_back(k);
i += 2;
}else if (k >= 0xD800 && k <= 0xD87F){
l = (k-0xD800)*0x10;
k = s[i+3]*0x100 + s[i+2];
if (k >= 0xDFF0 && k <= 0xDFFF){
l += (k - 0xDFF0) + 0xD800;
v.push_back(l);
i += 4;
}else{
//Err
v.push_back(-1);
i += 4;
}
}else if (k >= 0xD880 && k <= 0xD8FF){
l = (k-0xD880)*0x1000000;
k = s[i+3]*0x100+s[i+2];
if (k < 0xD900 || k > 0xD9FF){
//Err
v.push_back(-1);
i += 8;
continue;
}
l += (k-0xD900)*0x10000;
k = s[i+5]*0x100+s[i+4];
if (k < 0xDA00 || k > 0xDAFF){
//Err
v.push_back(-1);
i += 8;
continue;
}
l += (k-0xDA00)*0x100;
k = s[i+7]*0x100+s[i+6];
if (k < 0xDB00 || k > 0xDBFF){
//Err
v.push_back(-1);
i += 8;
continue;
}
l += (k-0xDB00);
l += 0x10000;
v.push_back(l);
i += 8;
}else if (k >= 0xDC00 && k <= 0xDDFF){
l = k-0xDC00;
for (int j=2;i+j<s.size();j+=2){
k = s[i+j+1]*0x100+s[i+j];
if (k >= 0xD900 && k <= 0xDAFF){
l *= 0x200;
l += k-0xD900;
}else if (k >= 0xDE00 && k <= 0xDFFF){
l *= 0x200;
l += k-0xDE00;
l += 0x80000000;
v.push_back(l);
i += j+2;
break;
}else{
v.push_back(-1);
i += j+2;
break;
}
}
}else{
v.push_back(-1);
i+=2;
}
}
return v;
}
bytes vec2sixteenALE(codepoint v){
bytes b;
cpp_int k = 0;
for (int i=0;i<v.size();i++){
if (v[i]<0){
continue;
}else if (v[i] <= 0xD7FF || (v[i] >= 0xE000 && v[i] <= 0xFFFF)){
b.push_back((unsigned char)(v[i]%0x100));
b.push_back((unsigned char)(v[i]/0x100));
}else if (v[i] >= 0xD800 && v[i] <= 0xDFFF){
b.push_back((unsigned char)((v[i]-0xD800)/0x10 % 0x80));
b.push_back((unsigned char)(0xD8));
b.push_back((unsigned char)((v[i]-0xD800)%0x10 + 0xF0));
b.push_back((unsigned char)(0xDF));
}else if (v[i] >= 0x10000 && v[i] <= 0x7FFFFFFF){
b.push_back((unsigned char)((v[i]-0x10000)/0x1000000%0x100 + 0x80));
b.push_back((unsigned char)(0xD8));
b.push_back((unsigned char)((v[i]-0x10000)/0x10000%0x100));
b.push_back((unsigned char)(0xD9));
b.push_back((unsigned char)((v[i]-0x10000)/0x100%0x100));
b.push_back((unsigned char)(0xDA));
b.push_back((unsigned char)((v[i]-0x10000)%0x100));
b.push_back((unsigned char)(0xDB));
}else{
k = keta(v[i] - 0x80000000);
cpp_int j = 0;
cpp_int p = 0;
while (true){
if (k >= j && k < j+9){
p = v[i] - 0x80000000;
bytes b2;
b2.insert(b2.begin(),(unsigned char)(p%0x100));
b2.insert(b2.begin()+1,(unsigned char)(p%0x200/0x100+0xDE));
p /= 0x200;
do{
b2.insert(b2.begin(),(unsigned char)(p%0x100));
b2.insert(b2.begin()+1,(unsigned char)(p%0x200/0x100+0xD9));
p /= 0x200;
}while (p >= 1);
b2[0] += 0x03;
b.insert(b.end(), b2.begin(), b2.end());//移し
break;
}
j += 9;
}
}
}
return b;
}
codepoint sixteenA2vec(bytes s){
return sixteenABE2vec(s);
}
bytes vec2sixteenA(codepoint v){
return vec2sixteenABE(v);
}
codepoint sixteenBBE2vec(bytes s){
int i = 0;
codepoint v;
cpp_int k;
cpp_int l;
while (i < s.size()){
k = s[i]*0x100+s[i+1];
if (k <= 0xD7FD || k>= 0xE000){
v.push_back(k);
i += 2;
}else if (k >= 0xD800 && k <= 0xDBFF){
l = (k-0xD800)*0x400;
k = s[i+2]*0x100+s[i+3];
if (k < 0xDC00 || k > 0xDFFF){
//Err
v.push_back(-1);
i += 4;
continue;
}
l += k-0xDC00;
l += 0x10000;
v.push_back(l);
i += 4;
}else if (k == 0xD7FE){
l = 0;
for (int j=2;j<s.size()-i;j+=2){
k = s[i+j]*0x100+s[i+j+1];
if (j==2 && k == 0xD7FF){
k = s[i+j+2]*0x100+s[i+j+3];
if (k == 0xD7FF){
v.push_back(0xD7FF);
i += 6;
break;
}
}else if (j==2 && k == 0xD7FE){
k = s[i+j+2]*0x100+s[i+j+3];
if (k == 0xD7FF){
v.push_back(0xD7FE);
i += 6;
break;
}
}else if (k >= 0xDC00 && k <= 0xDFFF){
if (i+j < s.size()-2 && j==2){
if (s[i+j+2]*0x100+s[i+j+3] == 0xD7FF){
v.push_back(k);
i += 6;
break;
}
}
l *= 0x400;
l += k-0xDC00;
}else if (k >= 0xD800 && k <= 0xDBFF){
if (i+j < s.size()-2 && j==2){
if (s[i+j+2]*0x100+s[i+j+3] == 0xD7FF){
v.push_back(k);
i += 6;
break;
}
}
l *= 0x400;
l += k-0xD800;
k = s[i+j+2]*0x100+s[i+j+3];
if (k == 0xD7FF){
l += 0x110000;
v.push_back(l);
i += j+4;
break;
}
}else if (k == 0xD7FF){
v.push_back(l);
i += j;
break;
}else if (l==0){
v.push_back(k);
i += 2;
break;
}else{
v.push_back(-1);
i += j;
break;
}
}
}else{
v.push_back(-1);
i+=2;
}
}
return v;
}
bytes vec2sixteenBBE(codepoint v){
bytes b;
cpp_int k = 0;
for (int i=0;i<v.size();i++){
if (v[i]<0){
continue;
}else if (v[i] <= 0xD7FD || (v[i] >= 0xE000 && v[i] <= 0xFFFF)){
b.push_back((unsigned char)(v[i]/0x100));
b.push_back((unsigned char)(v[i]%0x100));
}else if (v[i] == 0xD7FE){
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(0xFE));
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(0xFE));
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(0xFF));
}else if (v[i] == 0xD7FF){
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(0xFE));
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(0xFF));
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(0xFF));
}else if (v[i] >= 0xD800 && v[i] <= 0xDFFF){
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(0xFE));
b.push_back((unsigned char)(v[i]/0x100));
b.push_back((unsigned char)(v[i]%0x100));
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(0xFF));
}else if (v[i] >= 0x10000 && v[i] <= 0x10FFFF){
b.push_back((unsigned char)((v[i]-0x10000)/0x400/0x100 + 0xD8));
b.push_back((unsigned char)((v[i]-0x10000)/0x400%0x100));
b.push_back((unsigned char)((v[i]-0x10000)%0x400/0x100 + 0xDC));
b.push_back((unsigned char)((v[i]-0x10000)%0x400%0x100));
}else if (v[i] == 0x110000){
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(0xFE));
b.push_back((unsigned char)(0xDC));
b.push_back((unsigned char)(0x00));
b.push_back((unsigned char)(0xD8));
b.push_back((unsigned char)(0x00));
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(0xFF));
}else{
k = keta(v[i] - 0x110000);
cpp_int j = 0;
cpp_int p = 0;
while (true){
if (k >= j && k < j+10){
p = v[i] - 0x110000;
b.push_back(0xD7);
b.push_back(0xFE);
bytes b2;
b2.insert(b2.begin(),(unsigned char)(p%0x400/0x100+0xD8));
b2.insert(b2.begin()+1,(unsigned char)(p%0x100));
p /= 0x400;
do{
b2.insert(b2.begin(),(unsigned char)(p%0x400/0x100+0xDC));
b2.insert(b2.begin()+1,(unsigned char)(p%0x100));
p /= 0x400;
}while (p >= 1);
b.insert(b.end(), b2.begin(), b2.end());//移し
b.push_back(0xD7);
b.push_back(0xFF);
break;
}
j += 10;
}
}
}
return b;
}
codepoint sixteenBLE2vec(bytes s){
int i = 0;
codepoint v;
cpp_int k;
cpp_int l;
while (i < s.size()){
k = s[i+1]*0x100+s[i];
if (k <= 0xD7FD || k>= 0xE000){
v.push_back(k);
i += 2;
}else if (k >= 0xD800 && k <= 0xDBFF){
l = (k-0xD800)*0x400;
k = s[i+3]*0x100+s[i+2];
if (k < 0xDC00 || k > 0xDFFF){
//Err
v.push_back(-1);
i += 4;
continue;
}
l += k-0xDC00;
l += 0x10000;
v.push_back(l);
i += 4;
}else if (k == 0xD7FE){
l = 0;
for (int j=2;j<s.size()-i;j+=2){
k = s[i+j+1]*0x100+s[i+j];
if (j==2 && k == 0xD7FF){
k = s[i+j+3]*0x100+s[i+j+2];
if (k == 0xD7FF){
v.push_back(0xD7FF);
i += 6;
break;
}
}else if (j==2 && k == 0xD7FE){
k = s[i+j+3]*0x100+s[i+j+2];
if (k == 0xD7FF){
v.push_back(0xD7FE);
i += 6;
break;
}
}else if (k >= 0xDC00 && k <= 0xDFFF){
if (i+j < s.size()-2 && j==2){
if (s[i+j+3]*0x100+s[i+j+2] == 0xD7FF){
v.push_back(k);
i += 6;
break;
}
}
l *= 0x400;
l += k-0xDC00;
}else if (k >= 0xD800 && k <= 0xDBFF){
if (i+j < s.size()-2 && j==2){
if (s[i+j+3]*0x100+s[i+j+2] == 0xD7FF){
v.push_back(k);
i += 6;
break;
}
}
l *= 0x400;
l += k-0xD800;
k = s[i+j+3]*0x100+s[i+j+2];
if (k == 0xD7FF){
l += 0x110000;
v.push_back(l);
i += j+4;
break;
}
}else if (k == 0xD7FF){
v.push_back(l);
i += j;
break;
}else if (l==0){
v.push_back(k);
i += 2;
break;
}else{
v.push_back(-1);
i += j;
break;
}
}
}else{
v.push_back(-1);
i+=2;
}
}
return v;
}
bytes vec2sixteenBLE(codepoint v){
bytes b;
cpp_int k = 0;
for (int i=0;i<v.size();i++){
if (v[i]<0){
continue;
}else if (v[i] <= 0xD7FD || (v[i] >= 0xE000 && v[i] <= 0xFFFF)){
b.push_back((unsigned char)(v[i]%0x100));
b.push_back((unsigned char)(v[i]/0x100));
}else if (v[i] == 0xD7FE){
b.push_back((unsigned char)(0xFE));
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(0xFE));
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(0xFF));
b.push_back((unsigned char)(0xD7));
}else if (v[i] == 0xD7FF){
b.push_back((unsigned char)(0xFE));
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(0xFF));
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(0xFF));
b.push_back((unsigned char)(0xD7));
}else if (v[i] >= 0xD800 && v[i] <= 0xDFFF){
b.push_back((unsigned char)(0xFE));
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(v[i]%0x100));
b.push_back((unsigned char)(v[i]/0x100));
b.push_back((unsigned char)(0xFF));
b.push_back((unsigned char)(0xD7));
}else if (v[i] >= 0x10000 && v[i] <= 0x10FFFF){
b.push_back((unsigned char)((v[i]-0x10000)/0x400%0x100));
b.push_back((unsigned char)((v[i]-0x10000)/0x400/0x100 + 0xD8));
b.push_back((unsigned char)((v[i]-0x10000)%0x400%0x100));
b.push_back((unsigned char)((v[i]-0x10000)%0x400/0x100 + 0xDC));
}else if (v[i] == 0x110000){
b.push_back((unsigned char)(0xFE));
b.push_back((unsigned char)(0xD7));
b.push_back((unsigned char)(0x00));
b.push_back((unsigned char)(0xDC));
b.push_back((unsigned char)(0x00));
b.push_back((unsigned char)(0xD8));
b.push_back((unsigned char)(0xFF));
b.push_back((unsigned char)(0xD7));
}else{
k = keta(v[i] - 0x110000);
cpp_int j = 0;
cpp_int p = 0;
while (true){
if (k >= j && k < j+10){
p = v[i] - 0x110000;
b.push_back(0xFE);
b.push_back(0xD7);
bytes b2;
b2.insert(b2.begin(),(unsigned char)(p%0x100));
b2.insert(b2.begin()+1,(unsigned char)(p%0x400/0x100+0xD8));
p /= 0x400;
do{
b2.insert(b2.begin(),(unsigned char)(p%0x100));
b2.insert(b2.begin()+1,(unsigned char)(p%0x400/0x100+0xDC));
p /= 0x400;
}while (p >= 1);
b.insert(b.end(), b2.begin(), b2.end());//移し
b.push_back(0xFF);
b.push_back(0xD7);
break;
}
j += 10;
}
}
}
return b;
}
codepoint sixteenB2vec(bytes s){
return sixteenBBE2vec(s);
}
bytes vec2sixteenB(codepoint v){
return vec2sixteenBBE(v);
}
codepoint thirtytwoBE2vec(bytes s){
int i = 0;
codepoint v;
cpp_int k;
cpp_int l;
while (i < s.size()){
k = (unsigned int)(s[i])*0x1000000+(unsigned int)(s[i+1]*0x10000+s[i+2]*0x100+s[i+3]);
if (k < 0x80000000){
v.push_back(k);
i+=4;
}else if (k <= 0x9FFFFFFF){
l = k - 0x80000000;
for (int j=4;i+j < s.size();j+=4){
k = (unsigned int)(s[i+j]*0x1000000)+(unsigned int)(s[i+j+1]*0x10000+s[i+j+2]*0x100+s[i+j+3]);
if (k >= 0xC0000000){
l *= 1<<30;
l += k - 0xC0000000;
}else if (k >= 0xA0000000 && k <= 0xBFFFFFFF){
l *= 1<<29;
l += k - 0xA0000000;
l += 0x80000000;
v.push_back(l);
i += j+4;
break;
}else{
v.push_back(-1);
i += 4;
break;
}
}
}else{
v.push_back(-1);
i += 4;
break;
}
}
return v;
}
bytes vec2thirtytwoBE(codepoint v){
bytes b;
cpp_int k = 0;
for (int i=0;i<v.size();i++){
if (v[i]<0){
continue;
}else if (v[i] <= 0x7FFFFFFF){
b.push_back((unsigned char)(v[i]/0x1000000));
b.push_back((unsigned char)(v[i]/0x10000%0x100));
b.push_back((unsigned char)(v[i]/0x100%0x100));
b.push_back((unsigned char)(v[i]%0x100));
}else{
k = keta(v[i] - 0x80000000);
cpp_int j = 58;
cpp_int p = 0;
if (k < j){
p = v[i] - 0x80000000;
b.push_back((unsigned char)((p/0x20000000)/0x1000000 + 0x80));
b.push_back((unsigned char)((p/0x20000000)/0x10000%0x100));
b.push_back((unsigned char)((p/0x20000000)/0x100%0x100));
b.push_back((unsigned char)((p/0x20000000)%0x100));
b.push_back((unsigned char)((p%0x20000000)/0x1000000 + 0xA0));
b.push_back((unsigned char)((p%0x20000000)/0x10000%0x100));
b.push_back((unsigned char)((p%0x20000000)/0x100%0x100));
b.push_back((unsigned char)((p%0x20000000)%0x100));
}else{
while (true){
if (k >= j && k < j+30){
p = (v[i] - 0x80000000)*2;
bytes b2;
b2.insert(b2.begin(),(unsigned char)((p%0x40000000/2)/0x1000000 + 0xA0));
b2.insert(b2.begin()+1,(unsigned char)((p%0x40000000/2)/0x10000%0x100));
b2.insert(b2.begin()+2,(unsigned char)((p%0x40000000/2)/0x100%0x100));
b2.insert(b2.begin()+3,(unsigned char)((p%0x40000000/2)%0x100));
p /= 0x40000000;
while (p >= 0x20000000){
b2.insert(b2.begin(),(unsigned char)((p%0x40000000)/0x1000000 + 0xC0));
b2.insert(b2.begin()+1,(unsigned char)((p%0x40000000)/0x10000%0x100));
b2.insert(b2.begin()+2,(unsigned char)((p%0x40000000)/0x100%0x100));
b2.insert(b2.begin()+3,(unsigned char)((p%0x40000000)%0x100));
p /= 0x40000000;
}
b2.insert(b2.begin(),(unsigned char)(p/0x1000000 + 0x80));
b2.insert(b2.begin()+1,(unsigned char)(p/0x10000%0x100));
b2.insert(b2.begin()+2,(unsigned char)(p/0x100%0x100));
b2.insert(b2.begin()+3,(unsigned char)(p%0x100));
b.insert(b.end(), b2.begin(), b2.end());//移し
break;
}
j += 30;
}
}
}
}
return b;
}
codepoint thirtytwoLE2vec(bytes s){
int i = 0;
codepoint v;
cpp_int k;
cpp_int l;
while (i < s.size()){
k = (unsigned int)(s[i+3])*0x1000000+(unsigned int)(s[i+2]*0x10000+s[i+1]*0x100+s[i]);
if (k < 0x80000000){
v.push_back(k);
i+=4;
}else if (k <= 0x9FFFFFFF){
l = k - 0x80000000;
for (int j=4;i+j < s.size();j+=4){
k = (unsigned int)(s[i+j+3]*0x1000000)+(unsigned int)(s[i+j+2]*0x10000+s[i+j+1]*0x100+s[i+j]);
if (k >= 0xC0000000){
l *= 1<<30;
l += k - 0xC0000000;
}else if (k >= 0xA0000000 && k <= 0xBFFFFFFF){
l *= 1<<29;
l += k - 0xA0000000;
l += 0x80000000;
v.push_back(l);
i += j+4;
break;
}else{
v.push_back(-1);
i += 4;
break;
}
}
}else{
v.push_back(-1);
i += 4;
break;
}
}
return v;
}
bytes vec2thirtytwoLE(codepoint v){
bytes b;
cpp_int k = 0;
for (int i=0;i<v.size();i++){
if (v[i]<0){
continue;
}else if (v[i] <= 0x7FFFFFFF){
b.push_back((unsigned char)(v[i]%0x100));
b.push_back((unsigned char)(v[i]/0x100%0x100));
b.push_back((unsigned char)(v[i]/0x10000%0x100));
b.push_back((unsigned char)(v[i]/0x1000000));
}else{
k = keta(v[i] - 0x80000000);
cpp_int j = 58;
cpp_int p = 0;
if (k < j){
p = v[i] - 0x80000000;
b.push_back((unsigned char)((p/0x20000000)%0x100));
b.push_back((unsigned char)((p/0x20000000)/0x100%0x100));
b.push_back((unsigned char)((p/0x20000000)/0x10000%0x100));
b.push_back((unsigned char)((p/0x20000000)/0x1000000 + 0x80));
b.push_back((unsigned char)((p%0x20000000)%0x100));
b.push_back((unsigned char)((p%0x20000000)/0x100%0x100));
b.push_back((unsigned char)((p%0x20000000)/0x10000%0x100));
b.push_back((unsigned char)((p%0x20000000)/0x1000000 + 0xA0));
}else{
while (true){
if (k >= j && k < j+30){
p = (v[i] - 0x80000000)*2;
bytes b2;
b2.insert(b2.begin(),(unsigned char)((p%0x40000000/2)%0x100));
b2.insert(b2.begin()+1,(unsigned char)((p%0x40000000/2)/0x100%0x100));
b2.insert(b2.begin()+2,(unsigned char)((p%0x40000000/2)/0x10000%0x100));
b2.insert(b2.begin()+3,(unsigned char)((p%0x40000000/2)/0x1000000 + 0xA0));
p /= 0x40000000;
while (p >= 0x20000000){
b2.insert(b2.begin(),(unsigned char)((p%0x40000000)%0x100));
b2.insert(b2.begin()+1,(unsigned char)((p%0x40000000)/0x100%0x100));
b2.insert(b2.begin()+2,(unsigned char)((p%0x40000000)/0x10000%0x100));
b2.insert(b2.begin()+3,(unsigned char)((p%0x40000000)/0x1000000 + 0xC0));
p /= 0x40000000;
}
b2.insert(b2.begin(),(unsigned char)(p%0x100));
b2.insert(b2.begin()+1,(unsigned char)(p/0x100%0x100));
b2.insert(b2.begin()+2,(unsigned char)(p/0x10000%0x100));
b2.insert(b2.begin()+3,(unsigned char)(p/0x1000000 + 0x80));
b.insert(b.end(), b2.begin(), b2.end());//移し
break;
}
j += 30;
}
}
}
}
return b;
}
codepoint thirtytwo2vec(bytes s){
return thirtytwoBE2vec(s);
}
bytes vec2thirtytwo(codepoint v){
return vec2thirtytwoBE(v);
}
codepoint seven2vec(bytes s){
int i = 0;
cpp_int l = 0;
codepoint v;
codepoint chk = {0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2B,0x2F};
while (i < s.size()){
if (s[i]==0x26){
l = 0;
for (int j=1;i+j<s.size();j++){
for (int k=0;k<64;k++){
if (chk[k] == s[i+j]){
l *= 0x40;
l += k;
}
}
if (s[i+j]==0x2D){
if (l==0 && j==1){
l = 0x26;
}
v.push_back(l);
i += j;
break;
}
}
}else if (s[i]>=0x80){
v.push_back(-1);
i++;
}else{
v.push_back(s[i]);
}
i++;
}
return v;
}
bytes vec2seven(codepoint v){
bytes b;
codepoint chk = {0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2B,0x2F};
for (int i=0;i<v.size();i++){
if (v[i] <= 0x7F && v[i] != 0x26){
b.push_back((unsigned int)(v[i]));
}else if (v[i] == 0x26){
b.push_back(0x26);
b.push_back(0x2D);
}else if (v[i] >= 0x80){
b.push_back(0x26);
bytes b2;
cpp_int p = v[i];
while (p >= 1){
b2.insert(b2.begin(),(unsigned char)(chk[(int)(p%0x40)]));
p /= 0x40;
}
b.insert(b.end(), b2.begin(), b2.end());
b.push_back(0x2D);
}
}
return b;
}
void vecprint(codepoint c){
for (int i=0;i<c.size();i++){
if (c[i] == -1){
cout << "-1";
}else{
cout << c[i].str(0,ios_base::hex);
}
if (i != c.size()-1){
cout << " , ";
}
}
cout << endl;
}
void byteprint(bytes b){
for (int i=0;i<b.size();i++){
if (b[i]<0x10){
cout << "0" << hex << +b[i];
}else{
cout << hex << +b[i];
}
if (i != b.size()-1){
cout << " , ";
}
}
cout << dec << endl;
}
int main(void){
bytes b;
codepoint c;
c = {0x3043,0x3084,0x3063,0x305F,0x3041,0x3041,0x3041,0x3041,0x3041,0xFF01,0xFF01,0xFF01,0x1B001,0x307F,0x3060,0x304A,0xFF01};
cout << "\e[48;2;0;0;255mYSF-CodePoint\e[49m" << endl;
vecprint(c);
cout << "\e[48;2;255;0;0mYSF-7\e[49m" << endl;
byteprint(vec2seven(c));
vecprint(seven2vec(vec2seven(c)));
cout << "\e[48;2;255;0;0mYSF-8\e[49m" << endl;
byteprint(vec2eight(c));
vecprint(eight2vec(vec2eight(c)));
cout << "\e[48;2;255;0;0mYSF-16A BE\e[49m" << endl;
byteprint(vec2sixteenABE(c));
vecprint(sixteenABE2vec(vec2sixteenABE(c)));
cout << "\e[48;2;255;0;0mYSF-16A LE\e[49m" << endl;
byteprint(vec2sixteenALE(c));
vecprint(sixteenALE2vec(vec2sixteenALE(c)));
cout << "\e[48;2;255;0;0mYSF-16B BE\e[49m" << endl;
byteprint(vec2sixteenBBE(c));
vecprint(sixteenBBE2vec(vec2sixteenBBE(c)));
cout << "\e[48;2;255;0;0mYSF-16B LE\e[49m" << endl;
byteprint(vec2sixteenBLE(c));
vecprint(sixteenBLE2vec(vec2sixteenBLE(c)));
cout << "\e[48;2;255;0;0mYSF-32 BE\e[49m" << endl;
byteprint(vec2thirtytwoBE(c));
vecprint(thirtytwoBE2vec(vec2thirtytwoBE(c)));
cout << "\e[48;2;255;0;0mYSF-32 LE\e[49m" << endl;
byteprint(vec2thirtytwoLE(c));
vecprint(thirtytwoLE2vec(vec2thirtytwoLE(c)));
return 0;
}