2016-09-30 3 views
1

Ich habe den folgenden Code, um ein Char-Array (wie 'hi \ n') zu binär zu konvertieren und in einem int-Array zu speichern.Char to binary conversion ist plötzlich falsch?

void data_to_binary(char *data){ 

bit_pos = 0; 
int i = 0, j = 0, k = 0; 
char mask = 0x80; 

for(i = 0; i < sizeof(data); ++i){ 
    if(data[i] != '\0' && data[i] != '\n'){ 
     mask = 0x80; 
     for(j = 0; j < 8; ++j){ 
      binary_data[bit_pos] = ((data[i] & mask) > 0); 
      mask >>= 1; 
      bit_pos++; 
     } 
    } 
} 
} 

Dies funktionierte perfekt. Ich bekam 01101000 01101001 für hallo. Ich habe NICHTS über diesen Code geändert und habe ihn erst kürzlich wieder ausgeführt und ich bekomme jetzt 01111111 01111111 .... Ich habe keine Ahnung, was vor sich geht. Während ich mit nicht verwandtem Code herumhantierte, bekam ich einen Haufen-Korruptionsfehler. Ist das, was das verursacht? Dass es sich immer noch negativ auf meinen Code auswirkt?

+4

'sizeof (Daten)' ist falsch. Das gibt Ihnen nicht die Größe des Arrays, nur die Größe des Zeigers. Wenn 'data' eine C-Zeichenfolge ist (dh NUL terminiert), dann verwenden Sie' strlen (data) '. Andernfalls müssen Sie die Array-Länge in die Funktion eingeben. – kaylum

+0

Ich kenne die Größe des Arrays leider nicht. Es wird vom Benutzer mit maximal 1024 Zeichen eingegeben. Und es ist gleich 2, also für den Fall von "hi" funktioniert es tatsächlich. Das wird mein Problem nicht lösen. –

+0

'strlen?' Vielleicht? oder "n = 0; while (* Daten) n ++; '? –

Antwort

2
  1. Was erwarten Sie von der Größe von (Daten)? Würden Sie nicht stattdessen die Strlen verwenden?
  2. Sie verwenden für die Maske ein signiertes Zeichen. Nach der ersten Ausführung von "Maske >> = 1;" Sie erhalten 0xC0 statt 0x40. Versuchen Sie, ein int oder ein unsigniertes Zeichen zu verwenden, um zu vermeiden, dass das Zeichen nach der Verschiebung gesetzt wird.