2017-11-24 6 views
0

Ich habe dieses Programm, das ganzzahlige Werte kodiert:Dekodierungs ganzzahligen Wert

#include "stdafx.h" 
#define _SECURE_SCL_DEPRECATE 0 
#include <iostream> 
#include <list> 
#include <vector> 
#include <algorithm> 

using namespace std; 

template<class T> 
vector<unsigned char> nToB(T); 
unsigned long ByteToint(vector<unsigned char> v) 
{ 
    unsigned long int a = 0; 
    int s = v.size(); 
    for (int i = 0; i<s ; i++) 
    { 
     a |= (v[s - 1 - i] << (8 * (s - i - 1))); 
    } 
    return a; 
} 

static unsigned long int Encode7Bits(unsigned long int); 

int main() 
{ 
    cout << Encode7Bits(420); 
    getchar(); 
    return 0; 
} 

static unsigned long int Encode7Bits(unsigned long int x) 
{ 
    vector<unsigned char> Result; 

    do 
    { 
     unsigned long int tmp = x & 0x7f; 
     x = x >> 7; 
     if (x > 0) 
      tmp |= 0x80;   
     Result.push_back((unsigned char)tmp); 
    } while (x > 0); 

    return ByteToint(Result); 
} 

Wenn das Argument für diese Funktion 420 ist, wird es 932.

Meine Frage zurück, ob es möglich ist, das Gegenteil zu tun Betrieb, eine Dekodierungsfunktion, die gegeben 932, 420 zurückgibt.

+1

Dies ist eine Trapdoor-Funktion. Vergiss es, es zu invertieren. – Detonar

Antwort

1

Nein ist es nicht.

|= ist nicht umkehrbar in dem Sinne, dass, wenn Sie c = a | b schreiben, dann c gegeben, und entweder a oder b, können Sie die anderen Variablen nicht wiederherstellen können.

Die bitweisen Operatoren << und >> sind offensichtlich verlustreich, da sie 0 Bits enthalten.

Sie werden mehr Glück mit XOR haben: Wenn Sie c = a^b schreiben, dann wird c^ba sein.

+1

Das gleiche gilt für "x = x >> 7". Nicht umkehrbar. – Detonar

+0

Ich fühle mich wie dieser Punkt fehlt jedoch. Die rechte Verschiebung und das ODER sind nicht das, was dieses nicht-invertierbare Element macht, sondern nur Blöcke von 7 Bits und die Kodierung mit einem "continue" -Bit, einer ziemlich normalen Ganzzahlkodierung mit variabler Länge. Das Problem ist, dass dadurch die Ausgabe für ausreichend hohe Werte erweitert wird, der Code jedoch die Ausgabe auf die ursprüngliche Größe zurücksetzt. – harold

Verwandte Themen