-3

少しデバッグが必要です。コードは 100% コンパイル可能です。ただし、圧縮するドキュメントの小さな断片を指定するとクラッシュし、解凍すると境界チェックに関するエラーが発生します。私もそれを実行するのは少し怖いです。危険ではありませんが、これが今の私の代表作です。それはまさに圧縮技術のスイートスポットです。これは私が作ったものです。微積分導出アルゴリズムを使用して、使用する数百万の一意のキーを取得します。これらはすべて予測可能です。そして、それらは一意であるため、ハッシュでキーを複数回取得して台無しにすることはできません。このコードの目的は、完全に再生可能で、圧縮時に損失を与えないハッシュを生成することです。ありがとうございました。

#include <iostream>
#include <bitset>
#include <vector>
#include <cmath>
#include <fstream>
#include <algorithm>

using namespace std;

class S_Rend {

    private:
    const bitset<8> beta=0xad;

    protected:
    bitset<8> alpha, lambda, gamma, omega;
        bitset<8> delta, eta, theta, ghost, spec;

    vector<long> cred;

    public:
    unsigned int integral;

        S_Rend() { delta=0x00; eta=0x00; theta=0x00; lambda=0x00; alpha=0x00; delta=0x00; };
    ~S_Rend() { };
    int s_render(ifstream&,ofstream&);
    int render(ifstream&,ofstream&);
    long s_nop(long t, int set);

} n;


/*+**- Project::Sailwinds -**+*/

long S_Rend::s_nop(long t,int set) {
    if (set) {
        integral=0;
        t=(long&)beta;
    }
    integral++;
    if (abs(round((t*1.618)*t-(integral+0.618))-1) <= 4294967296)
        return (abs(round((t*1.618)*t-(integral+0.618))-1));
    else
        return (abs(round(sqrt(t))+(round(sqrt(t))*round(sqrt(integral))+1)));
}

int S_Rend::render(ifstream& in, ofstream& out) {

    long bn;
    long size=0;
    long t;
    if (!(in.is_open()))
    { return -1; }
    else {
    t=(long&)beta;

    for_each (std::istreambuf_iterator<char>(in), \
        std::istreambuf_iterator<char>(), \
        [&] (int x) {
        t=s_nop((long&)t,0);
        cred.push_back(t);
        alpha = (long&)cred[size];
        delta = (long&)x;
        lambda ^= (alpha ^ delta);
        lambda ^= beta;
        lambda = (int&)lambda + 1;
        size++;
    });
        printf("*");
    }
    if (out.is_open())
    { out << lambda << endl;
        out << size << endl;
            out << delta << endl;
                out << cred[size-1] << endl; }

    else { return -1; }
    in.close();
    out.close();
    return 0;
}

int S_Rend::s_render(ifstream& in, ofstream& out) {

    long i, n;
    long size;
    long t;
    long chk;
    in >> lambda;
    in >> size;
    in >> delta;
    in >> chk;
    t=(long&)beta;
    long bn=0;

    while (size-1>=bn) {
        t=s_nop((long&)t,0);
        cred.push_back(t);
        bn++;       
    }

    if (cred[bn-1]==chk)
        cout << "\nValidity Pass... Success!" << endl;
    else {
        printf("\nValidity Pass...Fail! %u != %u",cred[cred.size()-1],chk);
        return 1;
    }

    cout << "\nWriting to Buffer..." << endl;

    vector<long> btrace;
    vector<long> ltr;
    bn=1;
    while (size-1>=bn) {
        ltr.push_back(1);
        btrace.push_back(1);

        ltr[0]=(long&)lambda;
        for (i=1;i<=btrace.size()-1;i++) {
            alpha = (long&)cred[size-bn];
            ghost = (long&)btrace[i-1];
            spec = (long&)ltr[bn] - 1;
            spec ^= (int&)beta;
            eta = spec | alpha;
            theta = spec & alpha;
            omega = spec | eta;
            gamma = spec & eta;
            if ((eta ^ gamma) == (theta ^ omega)) {
                printf(".");
                ghost = (eta ^ gamma);
                btrace[i-1] = (long&)ghost;
            }
        }
        bn++;

    }

    cout << "One more second..\n";
    bn=0;

    while (bn<=btrace.size()-1) {
        bn++;
        delta = (long&)btrace[bn];
        out << (const char)(long&)delta;
    }

    cout << "\nBuffer Written... Exiting..\n";
    in.close();
    out.close();
    printf("*");
    return 0;
}

int main() {

    string outfile = "";
    string infile = "";
    string DC = "1";
    printf("Enter <C> or <D> to compress or decompress ");
    cin >> DC;

    printf("\nInput File: ");
    cin >> infile;
    ifstream in;
    in.open(infile.c_str(), std::ios::in | std::ios::binary);

    if (in.fail())
        return -1;

    printf("\nOutput File: ");
    cin >> outfile;
    ofstream out;
    out.open(outfile.c_str(), std::ios::out);

    if (out.fail())
        return -1;

    if ((DC=="c") || (DC=="C"))
            bool f=n.render(in, out);
    if ((DC=="d") || (DC=="D"))
            bool f=n.s_render(in, out);

    printf("\nProgram Execution Done.");


    n.~S_Rend();
    return 0;

}
4

2 に答える 2

2

この最後の while ループは、インデックス 1 から (および含む!) にアクセスしていますbtrace.size()

bn=0;

while (bn<=btrace.size()-1) {
    bn++;
    delta = (long&)btrace[bn];
    out << (const char)(long&)delta;
}

bn++;他のすべてのループで行ったように、ループの最後に移動します。

そして、私はuser4581301に同意する必要があります。<= size-1代わりに使用すると、< size奇妙に見えます。

于 2015-11-27T02:30:24.493 に答える
0

(int &)betaは間違いです。これはreinterpret_cast、厳密なエイリアシング ルールに違反する です。おそらく範囲外にもアクセスします。たとえばbitset<8>、1 バイトしかないかもしれませんが(int &)beta、そのメモリ位置から 4 バイトを読み取ります。

代わりに を使用する必要がありますbeta.to_ulong()。何十箇所も同じ間違いをします。

コードからすべてのキャストを削除します。キャスト (特に C スタイルのキャスト) を使用すると、コンパイラに「これが間違っていても警告しないでください。自分が何をしているのかはわかっています」と伝えられます。しかし実際には、あなたは自分が何をしているのかわかりません。ほとんどの場合、C++ はキャストを使用せずに記述できます。

(他にも間違いがあるかもしれませんが、最初に読んだときにこれだけが目立ちました。これらすべてを修正して、もう一度やり直してください)。

于 2015-11-27T22:21:37.167 に答える