提交 ea2124c5 编写于 作者: 丁劲犇's avatar 丁劲犇 😸

1. 头部添加校验和

2. 四路合并处理
上级 30be1cb0
......@@ -6,8 +6,9 @@
#include <ctime>
#include <cmath>
#include <string>
#include <unordered_set>
#include <QTextStream>
#include <memory>
#include <unordered_set>
#include "clsm_viterbi.h"
#include "conv_lsm_codec.h"
#include "cmdlineparser.h"
......@@ -17,7 +18,7 @@ const int OFFLINEDEBUG = 0;
const int VIT_WINLEN=64;
//处理逻辑
int do_function(const cmdlineParser & args);
std::vector<std::vector<unsigned char> > alg_decap(const std::vector<unsigned char> & bits,void * codec, int bais);
std::vector<std::vector<unsigned char> > alg_decap(const std::vector<unsigned char> & bits,void * codec);
//全局的终止标记
static bool bfinished = false;
using namespace std;
......@@ -34,7 +35,7 @@ int main(int argc , char * argv[])
else
{
FILE * old_stdin, *old_stdout;
auto ars = debug("D:/projects/pid6300",&old_stdin,&old_stdout);
auto ars = debug("D:/projects/pid5596",&old_stdin,&old_stdout);
args.parser(ars);
}
......@@ -101,41 +102,15 @@ int do_function(const cmdlineParser & args)
}
else if (header.subject_id == sub_input && packagedta.size())
{
std::unordered_set<unsigned int> set_output;
//4倍速采样起点,每个试一下
for (int i=0;i<4;++i)
std::vector<std::vector<unsigned char> > res = alg_decap(packagedta,codec);
if (sub_output && res.size())
{
std::vector<std::vector<unsigned char> > res = alg_decap(packagedta,codec,i);
if (sub_output && res.size())
for(int n=0;n<res.size();++n)
{
for(int n=0;n<res.size();++n)
if (res[n].size()>4)
{
if (res[n].size()>4)
{
const int rawsz = res[n].size()-4;
//Checksum
unsigned int vsum = 0;
unsigned char * psum = (unsigned char *) &vsum;
for (int i=0;i<rawsz;++i)
{
unsigned int vl = (vsum >>24) &0xff;
unsigned int vr = res[n][i] ^ vl;
vsum <<=8;
vsum ^=vr;
}
if (res[n][rawsz] != psum[0])
continue;
if (res[n][rawsz+1] != psum[1])
continue;
if (res[n][rawsz+2] != psum[2])
continue;
if (res[n][rawsz+3] != psum[3])
continue;
if (set_output.find(vsum)!=set_output.end())
continue;
set_output.insert(vsum);
TASKBUS::push_subject(sub_output,instance,res[n].size()-4,res[n].data());
}
const int rawsz = res[n].size()-4;
TASKBUS::push_subject(sub_output,instance,res[n].size()-4,res[n].data());
}
}
}
......@@ -160,11 +135,18 @@ int do_function(const cmdlineParser & args)
return res;
}
long long g_starts[4] = {0,0,0,0};
QVector<long long> cache_bits[4];
std::vector<std::vector<unsigned char> > alg_decap(const std::vector<unsigned char> & packages,void * codec, int bais)
long long totalCaps = 0;
std::vector<std::vector<unsigned char> > alg_decap(const std::vector<unsigned char> & packages,void * codec)
{
std::vector<std::vector<unsigned char> > res;
static std::shared_ptr<unsigned char> deinterbits[4] {
std::shared_ptr<unsigned char>(new unsigned char [65536*3*8+21]),
std::shared_ptr<unsigned char>(new unsigned char [65536*3*8+21]),
std::shared_ptr<unsigned char>(new unsigned char [65536*3*8+21]),
std::shared_ptr<unsigned char>(new unsigned char [65536*3*8+21])
};
//unsigned char header[32] = {0,1,1,1,1,1,1,0, 0,0,1,1,0,1,0,1, 0,0,1,0,1,0,0,1, 1,1,0,1,0,1,0,1};
unsigned char header[32] = {0,1,1,1,1,1,1,0, 0,0,1,1,0,1,0,1, 0,0,1,0,1,0,0,1, 1,1,0,1,0,1,0,1};
//0. Append to cache
......@@ -172,127 +154,199 @@ std::vector<std::vector<unsigned char> > alg_decap(const std::vector<unsigned ch
const int sym_total = packages.size()/sizeof(long long)/4;
for (int i=0;i<sym_total;++i)
{
cache_bits[bais].push_back(pSyms[i*4+bais]);
for (int j=0;j<4;++j)
{
cache_bits[j].push_back(pSyms[i*4+j]);
}
}
std::unordered_set<long long> nResBs;
//fprintf(stderr,"decap %d bits.",sym_total);
while (cache_bits[bais].size())
for (int bais = 0; bais < 4;++bais)
{
//1.Find header
int nPos = 0;
int nStart = -1;
int Oppo = 0;
int errb = 0;
while (nPos + 64 <cache_bits[bais].size() && nStart<0)
//1. Batch deal
const int cacheSize = cache_bits[bais].size();
const long long * pCache = cache_bits[bais].data();
int nStart = 0;
//fprintf(stderr,"decap %d bits.",sym_total);
while (nStart < cacheSize)
{
errb = 0;
for (int i=0;i<32;++i)
//1.Find header
int Oppo = 0;
int errb = 0;
int H = 0;
bool HitHead = false;
if (nStart + 32*2 <cacheSize)
{
int bt = cache_bits[bais][nPos+i*2] > cache_bits[bais][nPos+i*2+1]?1:0;
if (bt!=header[i])
++errb;
errb = 0;
for (int i=0;i<32;++i)
{
int bt = pCache[nStart+i*2] > pCache[nStart+i*2+1]?1:0;
if (bt!=header[i])
++errb;
}
if (errb==0||errb==32)
{
HitHead = true;
Oppo = errb<3?0:1;
}
else
{
++nStart;
continue;
}
}
if (errb==0||errb==32)
else
break;
H += 64;
//Hitted start
//2. Length 16 bits and checksum
//Length, protected by checksum
if (nStart + H + (16+16) * 8 * 2 >= cacheSize)
break;
unsigned char sprheader[2][8] = {
{1,1,0,1,0,0,0,1},
{0,1,0,1,1,0,1,1}
};
unsigned long long len = 0, lencheck = 0;
for (int i=0;i<16;++i)
{
nStart = nPos;
Oppo = errb<3?0:1;
int p0 = 0, p1 = 0;
for (int j=0;j<8;++j)
{
int b0 = pCache[nStart+H+i*8*2+j*2] < pCache[nStart+H+i*8*2+j*2+1]?0:1;
p0 += (b0==((sprheader[0][j]+Oppo)%2))?1:0;
p1 += (b0==((sprheader[1][j]+Oppo)%2))?1:0;
}
unsigned int b = p0>=p1?0:1;
len ^= (b<<i);
}
++nPos;
}
if (nStart>=0)
cache_bits[bais].remove(0,nStart);
else if (nPos>2)
{
//Delete
cache_bits[bais].remove(0,nPos-1);
return res;
}
nStart = 0;
//fprintf(stderr,"Header Detected err = %d.",errb);
H += 16 * 8 * 2;
//2. Length 16 bits
//Length, protected by coding spread 1:8,16bits:128bits
if (cache_bits[bais].size()<(16*8+32)*2)
return res;
unsigned char sprheader[2][8] = {
{1,1,0,1,0,0,0,1},
{0,1,0,1,1,0,1,1}
};
unsigned int len = 0;
for (int i=0;i<16;++i)
{
int p0 = 0, p1 = 0;
for (int j=0;j<8;++j)
for (int i=0;i<16;++i)
{
int b0 = cache_bits[bais][64+i*8*2+j*2] < cache_bits[bais][64+i*8*2+j*2+1]?0:1;
p0 += (b0==((sprheader[0][j]+Oppo)%2))?1:0;
p1 += (b0==((sprheader[1][j]+Oppo)%2))?1:0;
int p0 = 0, p1 = 0;
for (int j=0;j<8;++j)
{
int b0 = pCache[nStart+H+i*8*2+j*2] < pCache[nStart+H+i*8*2+j*2+1]?0:1;
p0 += (b0==((sprheader[0][j]+Oppo)%2))?1:0;
p1 += (b0==((sprheader[1][j]+Oppo)%2))?1:0;
}
unsigned int b = p0>=p1?0:1;
lencheck ^= (b<<i);
}
H += 16 * 8 * 2;
if (len >=65536 || lencheck != len * 1000427 % 65536)
{
++nStart;
continue;
}
unsigned int b = p0>=p1?0:1;
len ^= (b<<i);
}
if (len >=10000)
{
cache_bits[bais].remove(0,nStart+64);
continue;
}
//fprintf(stderr,"Length = %u Bytes.",len);
const int bitlen = len * 3 * 8 + 7 * 3;
if (cache_bits[bais].size()<(bitlen+32+128)*2)
return res;
//Length Ok
const int bitlen = len * 3 * 8 + 7 * 3;
//3. decode
std::vector<int> code;
const int valid_syms = len*8 + 7;
for (int i=0;i<valid_syms+VIT_WINLEN;++i)
{
int v = 0;
if (i<valid_syms)
if (nStart + bitlen*2 + H >= cacheSize)
break;
if (nResBs.find(g_starts[bais] + nStart)!=nResBs.end())
{
int b1 = ((cache_bits[bais][(32+128)*2+(i*3+0)*2]<cache_bits[bais][(32+128)*2+(i*3+0)*2+1])?0:1) ^ Oppo;
int b2 = ((cache_bits[bais][(32+128)*2+(i*3+1)*2]<cache_bits[bais][(32+128)*2+(i*3+1)*2+1])?0:1) ^ Oppo;
int b3 = ((cache_bits[bais][(32+128)*2+(i*3+2)*2]<cache_bits[bais][(32+128)*2+(i*3+2)*2+1])?0:1) ^ Oppo;
v = (b1<<2) ^ (b2<<1) ^ b3;
nStart += bitlen*2 + H;
continue;
}
code.push_back(v);
}
LSMVIT::reset_status(codec);
LSMVIT::decode(codec,code.data(),code.size(),true);
std::vector<int> data;
data.resize(len*8);
int poped = LSMVIT::pop_data(codec,data.data(),len*8);
int bestHamm = LSMVIT::curr_best_hamming(codec);
//fprintf(stderr,"Hamm = %d."
// ,LSMVIT::curr_best_hamming(codec));
//4. form data
if (poped == len *8)
{
//Output
std::vector<unsigned char> frame;
//xor code
unsigned char scm[15] = {1,0,1,1,0,0,1,1,1,1,0,0,1,1,0};
for (int i=0;i<len;++i)
//DeInter
unsigned char * deinterb = deinterbits[bais].get();
for (long long i=0;i<bitlen;++i)
{
unsigned char Byte = 0;
for (int j=0;j<8;++j)
int b1 = ((pCache[nStart+H+i*2]<pCache[nStart+H+i*2+1])?0:1) ^ Oppo;
deinterb[i * 85535999 % bitlen] = b1;
}
//3. decode
std::vector<int> code;
const int valid_syms = len*8 + 7;
for (int i=0;i<valid_syms+VIT_WINLEN;++i)
{
int v = 0;
if (i<valid_syms)
{
const int ib = i *8 + j;
const int b = data[ib];//(input[i]>>j)&0x01;
const int d = b ^ scm[ib % 15];
scm[ib%15] ^= (scm[(ib+13)%15] ^ scm[(ib+14)%15]);
Byte ^= (d << j);
int b1 = deinterb[i*3+0];
int b2 = deinterb[i*3+1];
int b3 = deinterb[i*3+2];
v = (b1<<2) ^ (b2<<1) ^ b3;
}
frame.push_back(Byte);
code.push_back(v);
}
res.push_back(std::move(frame));
fprintf(stderr,"Decaped %d Bytes with hamm %d.\n",len,bestHamm);
LSMVIT::reset_status(codec);
LSMVIT::decode(codec,code.data(),code.size(),true);
std::vector<int> data;
data.resize(len*8);
int poped = LSMVIT::pop_data(codec,data.data(),len*8);
int bestHamm = LSMVIT::curr_best_hamming(codec);
// fprintf(stderr,"Hamm = %d."
// ,LSMVIT::curr_best_hamming(codec));
//4. form data
if (poped == len *8)
{
//Output
std::vector<unsigned char> frame;
//xor code
unsigned char scm[15] = {1,0,1,1,0,0,1,1,1,1,0,0,1,1,0};
for (int i=0;i<len;++i)
{
unsigned char Byte = 0;
for (int j=0;j<8;++j)
{
const int ib = i *8 + j;
const int b = data[ib];//(input[i]>>j)&0x01;
const int d = b ^ scm[ib % 15];
scm[ib%15] ^= (scm[(ib+13)%15] ^ scm[(ib+14)%15]);
Byte ^= (d << j);
}
frame.push_back(Byte);
}
//Checksum
const int rawsz = frame.size()-4;
//Checksum
unsigned int vsum = 0;
unsigned char * psum = (unsigned char *) &vsum;
for (int i=0;i<rawsz;++i)
{
unsigned int vl = (vsum >>24) &0xff;
unsigned int vr = frame[i] ^ vl;
vsum <<=8;
vsum ^=vr;
}
if (frame[rawsz] == psum[0] && frame[rawsz+1] == psum[1] &&
frame[rawsz+2] == psum[2] && frame[rawsz+3] == psum[3])
{
//fprintf(stderr,"Decaped %d Bytes with hamm %d.and Checksum OK\n",len,bestHamm);
res.push_back(std::move(frame));
nResBs.insert(g_starts[bais] + nStart);
}
//else
//fprintf(stderr,"Decaped %d Bytes with hamm %d.But Checksum Bad\n",len,bestHamm);
}
H += bitlen*2;
nStart += H;
}//end while cache size >0
if (nStart)
{
cache_bits[bais].remove(0,nStart);
g_starts[bais] += nStart;
}
cache_bits[bais].remove(0,(bitlen+32+128)*2);
}//end while cache size >0
}//end for (int bais = 0; bais < 4;++bais)
fflush(stderr);
return res;
}
......@@ -116,6 +116,7 @@ int do_function(const cmdlineParser & args)
return res;
}
static long long total_packs = 0;
std::vector<unsigned char> alg_encap(const std::vector<unsigned char> & inputData)
{
......@@ -152,7 +153,7 @@ std::vector<unsigned char> alg_encap(const std::vector<unsigned char> & inputDat
//2. Length 16 bits
//Length, protected by coding spread 1:8,16bits:128bits
unsigned int len = input.size();
unsigned long long len = input.size();
if (len >=65536)
return err;
unsigned char sprheader[2][8] = {
......@@ -165,9 +166,17 @@ std::vector<unsigned char> alg_encap(const std::vector<unsigned char> & inputDat
for (int j=0;j<8;++j)
vec_bits.push_back(sprheader[b][j]);
}
//Checksum for length
unsigned long long len_check = len * 1000427 % 65536 ;
for (int i=0;i<16;++i)
{
const int b = (len_check>>i)&0x01;
for (int j=0;j<8;++j)
vec_bits.push_back(sprheader[b][j]);
}
//3. Data, 1/3 conv code OCT 165,133,171
unsigned char reg[6] = {0,0,0,0,0,0};
std::vector<unsigned char> vec_info;
//xor code
unsigned char scm[15] = {1,0,1,1,0,0,1,1,1,1,0,0,1,1,0};
for (int i=0;i<len;++i)
......@@ -179,9 +188,9 @@ std::vector<unsigned char> alg_encap(const std::vector<unsigned char> & inputDat
const int c = b ^ scm[ib % 15];
scm[ib%15] ^= (scm[(ib+13)%15] ^ scm[(ib+14)%15]);
vec_bits.push_back(c^reg[0]^reg[1]^reg[3]^reg[5]);
vec_bits.push_back(c^reg[1]^reg[2]^reg[4]^reg[5]);
vec_bits.push_back(c^reg[0]^reg[1]^reg[2]^reg[5]);
vec_info.push_back(c^reg[0]^reg[1]^reg[3]^reg[5]);
vec_info.push_back(c^reg[1]^reg[2]^reg[4]^reg[5]);
vec_info.push_back(c^reg[0]^reg[1]^reg[2]^reg[5]);
reg[5] = reg[4];
reg[4] = reg[3];
......@@ -195,9 +204,9 @@ std::vector<unsigned char> alg_encap(const std::vector<unsigned char> & inputDat
for (int i=0;i<7;++i)
{
const int c = 0;
vec_bits.push_back(c^reg[0]^reg[1]^reg[3]^reg[5]);
vec_bits.push_back(c^reg[1]^reg[2]^reg[4]^reg[5]);
vec_bits.push_back(c^reg[0]^reg[1]^reg[2]^reg[5]);
vec_info.push_back(c^reg[0]^reg[1]^reg[3]^reg[5]);
vec_info.push_back(c^reg[1]^reg[2]^reg[4]^reg[5]);
vec_info.push_back(c^reg[0]^reg[1]^reg[2]^reg[5]);
reg[5] = reg[4];
reg[4] = reg[3];
reg[3] = reg[2];
......@@ -206,8 +215,15 @@ std::vector<unsigned char> alg_encap(const std::vector<unsigned char> & inputDat
reg[0] = c;
}
fprintf(stderr,"Encaped %d bytes.\n",input.size());
//Interleaver
const int sizev = vec_info.size();
assert(sizev==len*3*8 + 7*3);
for (long long i=0;i<sizev;++i)
{
vec_bits.push_back(vec_info[i * 85535999 % sizev]);
}
if (++total_packs % 100==0)
fprintf(stderr,"Encaped %lld caps.\n",total_packs);
return vec_bits;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册