2012-04-07 11 views
2

Ich habe eine Zeichenfolge "SOMETHING /\xff" und ich möchte die hexadezimale Darstellung von 0xff in einem char Puffer speichern. Also ich strncpy alles nach dem Schrägstrich (/) in meinen Puffer (nennen wir es buff).Speichern von Hex-Wert in C-String?

Wenn ich jedoch den Befehl gdb print \x buff verwende, um den Inhalt von buff anzuzeigen, wird 0xff nicht angezeigt. Irgendwelche Ideen, was könnte falsch sein? Ist es möglich, dass mein Forward Slash die Dinge durcheinander bringt?

+0

Dies ist nicht klar. Wie bereits in den Antworten auf die vorherigen Fragen erklärt, wird '\ xff' nicht im String gespeichert. Ein einzelnes Zeichen (dessen Wert 255 ist) wird an seiner Stelle gespeichert. –

+1

Der Schrägstrich sollte die folgenden Zeichen nicht beeinflussen. Was _does_ gdb im Puffer anzeigen? –

+1

Haben Sie einen Code für diesen Absatz? – DavidO

Antwort

3

Ich denke, Ihr Problem hat mit der Art zu tun, wie Sie die Variable in gdb drucken. Nehmen Sie dieses einfache Programm, kompilieren als debug (-g bei Verwendung von gcc), und laufen und brechen in der ersten puts Aussage:

int main(void) 
{ 
    char *ptr = "str \xff"; 
    char arr[] = "str \xff"; 
    puts(ptr); 
    puts(arr); 

    return 0; 
} 

Wenn ich versuche und Druck ptr so, wie Sie erwähnt haben, p /x ptr, es werde drucken sie den Wert von ptr (die Adresse es zeigt auf):

(gdb) p /x ptr 
$1 = 0x4005f8 

Allerdings, wenn ich für arr den gleichen Befehl tun, ich werde:

(gdb) p /x arr 
$2 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0} 

Das liegt daran, dass gdb sehen kann, dass arr vom Typ char[6] und nicht char* ist. Sie können die gleichen Ergebnisse mit dem Befehl p /x "str \xff", erhalten, die für die Prüfung Dinge nützlich ist:

(gdb) p /x "str \xff" 
$3 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0} 


Jetzt, wenn Sie wollen in der Lage zu drucken Sie eine bestimmte Menge an Bytes von der Adresse hingewiesen durch ein Zeiger, verwendet, um den untersuchen (x) Speicherbefehl anstelle von Druck (p):

(gdb) x/6bx ptr 
0x4005f8 <__dso_handle+8>: 0x73 0x74 0x72 0x20 0xff 0x00 

die 6 Byte in hex gedruckt wird von der Adresse, die von ptr spitz. Versuchen Sie das mit Ihrer buff Variable und sehen Sie, wie Sie gehen.


Alternativ kann eine andere Sache, die Sie versuchen können, ist:

(gdb) p /x (char[6])*ptr 
$4 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0} 

Dies wird behandeln die char als das erste Element von ptr wies in einer Anordnung von 6 char s, und wird es Ihnen ermöglichen, um den Druckbefehl zu verwenden.

-2

Beachten Sie, dass eine Zeichenfolge in C ein Array von char Werten ist. Und eine char ist eine vorzeichenlose 8-Bit-Menge. (So ​​wie eine int ist eine vorzeichenbehaftete 16-Bit-Menge.) Der maximale Wert, der in einem vorzeichenlosen 8-Bit-Feld platziert werden kann, ist 255 dezimal, das ist 0xFF hex oder 0377 oktal oder 11111111 binär.

Innerhalb einer Zeichenfolge mit Anführungszeichen in C bedeutet die Notation \xNN das Einfügen des Zeichens, dessen Hexadezimalwert NN ist.

+1

-1; Nichts in der Norm sagt, dass "char" nicht vorzeichenbehaftet ist und nichts im Standard sagt, dass es 8 Bits sein muss oder dass "int" 16 Bits sein muss. In der Tat sind in den meisten Compilern heutzutage 32 Bits. –

0

0xFF ist kein druckbares ASCII-Zeichen, daher kann gdb es nicht drucken.

Verwandte Themen