2013-02-11 8 views
0
#include <iostream> 
#include <string> 

using namespace std; 

int get_bin_representation(char x){ 

    if(x == '1'){ 
    return 1; 
    } 
    else if(x == '0'){ 
    return 0; 
    } 
} 
int gen_hamming_code(string token){ 

    int bits[4]; 
    int temp(0); 

    for(int k=0; k<4; k++){ 
    bits[k] = get_bin_representation(token.at(k)); 
    } 

    int ham_code[7]; 

    ham_code[0] = bits[0] + bits[1] + bits[3]; 
    ham_code[1] = bits[0] + bits[2] + bits[3]; 
    ham_code[2] = bits[0]; 
    ham_code[3] = bits[1] + bits[2] + bits[3]; 
    ham_code[4] = bits[1]; 
    ham_code[5] = bits[2]; 
    ham_code[6] = bits[3]; 

    for(int h=0; h<7; h++){ 
    temp = ham_code[h]; 
    ham_code[h] = temp%2; 
    temp = 0; 
    } 

    for(int e=0; e<7; e++){ 
    cout << ham_code[e]; 
    } 
    cout << endl; 

    return 0; 
} 
int main(){ 

    string usr_input; 
    string msg; 
    int index(0); 

    cout << "Hamming Code Program" << endl; 

    while(true){ 

    cout << endl << ": "; 
    getline(cin, usr_input); 

    if(usr_input.find("gen") != std::string::npos){ 
     for(int i=0; i<usr_input.length(); i++){ 
      if(usr_input.at(i) == ' '){ 
       index = i; 
      } 
     } 

     for(int j=index; j<usr_input.length(); j++){ 
      msg+=usr_input.at(j); 
     } 

     cout << "Hamming code (7,4): "; 
     gen_hamming_code(msg); 
    } 
    } 
} 

Я использовал определение линейной алгебры, предоставленное Википедией («Код Хэмминга (7,4)»). В нескольких точках программы я печатал содержимое переменной, но исправление одной проблемы приводило к другой. Чтобы проверить правильность вывода, я сравнил его с примером, доступным в Википедии, и результатом, полученным с помощью online calculator.Код Хэмминга (7,4) - Сбой реализации С ++

ОБНОВЛЕНО: Вопрос разрешен. Я использовал адаптацию алгоритма, предоставленного here (без AMP).

+0

Вы делаете это с укусами или строками 0 и 1? Причина, по которой я спрашиваю, вы используете getline, который предназначен для чтения строк в формате ASCII. Возможно, вы захотите прочитать fread из stdin. Кроме того, если вы используете бит, вы можете захотеть взглянуть на std :: bitset для более удобного способа обработки ваших бит. – Freddy

+0

Ввод интерпретируется как строка, а затем каждый символ преобразуется в целое число, либо ноль, либо одно - это выполняется функцией get_bin_representation(). – user2062542

ответ

2

Ну, это неправильно:

ham_code[0] = bits[0] + bits[1] + bits[3]; 

кодов Хемминга определяются с использованием GF (2) арифметику. Сложение в GF (2) является оператором x ++ xor (^). Используйте правильный оператор, и вы можете покончить с более поздним циклом %2.

Вы также смешали биты четности с открытым текстом, чего никогда не делали, когда я узнал об этом. Кроме того, онлайн-симулятор использует простой порядок (открытый текст, четность) без чередования.

Смежные вопросы