2009-03-06 10 views
2

Ich versuche, eine Hex-Zeichenfolge wie folgt zu erhöhen:Erhöhungsschritte Hexstring

 
#$67#$1c#$87#$b1; 
#$67#$1c#$87#$b2; 
#$67#$1c#$87#$b3; 

Hier ist mein Verfahren:

var test : array [0..3] of char; intSequence : cardinal; 

Sequence := #$67#$1c#$87#$b1; 

procedure IncSequence; 
begin 
    move(Sequence[1],intSequence,SizeOF(Sequence)); 
    inc(intSequence); 
    move(intSequence,Sequence[1],SizeOf(test)); 
end; 

Whith diesem Verfahren nur das zweite Byte Zuwachs. Das Ergebnis ist:

 
#$67#$1D#$87#$B1 
#$67#$1E#$87#$B1 
#$67#$1F#$87#$B1 

Dank

Antwort

1

Wenn Sie die Sequenz erhöhen möchten, sollten Sie so etwas tun:

move(Sequence[0], intSequence, SizeOf(Cardinal)); 
inc(intSequence); 
move(intSequence, Sequence[0], SizeOf(Cardinal)); 

Ihr Code funktioniert nicht, weil Sequenz [1] Punkte zu dem zweiten Byte der Sequenz (Arrays beginnen mit 0) und sowohl Sequenz als auch Test bestehen aus Bytes/Zeichen, so wird nur 1 Byte übertragen.

EDIT: Nachdem ich dies versucht habe, sah ich, dass IntSequence in "Rückwärts" -Byte Reihenfolge gespeichert ist, inkrementiert das erste Byte der Sequenz, so dass Sie vielleicht Sequenz vorher umkehren möchten.

1

Sie haben drei Probleme hier:

  1. SizeOf (Sequenz) ist nicht die Länge einer Sequenz.
  2. Sie haben Ihren Sequenztyp als [0..3] definiert, daher müssen Sie den Index als 0
  3. Endian-Probleme starten. Auf Little-Endian-Maschinen, auch wenn Sie rechts die Indizes und Längen tun werden, werden Sie #$67#$1c#$87#$b1 #$68#$1c#$87#$b1 #$69#$1c#$87#$b1 ... Für Lösung für dieses Problem umgehen, sehen this article
+0

Anfangs benutzte ich eine Zeichenfolge und änderte nicht meine Array-Offset für das Array von char. Nur ein Fehler. Mein Hauptproblem war die Endian-Ness. Ich habe deinen Artikel verfolgt und alles funktioniert jetzt großartig. Vielen Dank! – user74899

7

Sie könnten auch dies tun, indem eine „Variante record“ zu schaffen und nur mit Inc();

type 
    testrec = record 
    case Byte of 
     0: (data: array[0..3] of AnsiChar); 
     1: (intSequence: Integer); 
    end; 
var 
    Sequence: testrec; 
begin 
    Sequence.data = #$b1#$87#$1c#$67; // reversed because of "endian-ness" 
    Inc(Sequence.intSequence); 
end; 

In diesem Fall werden die Daten und intSequence Felder „Overlay“ einander im Speicher, so dass alle Schreibvorgänge auf ein Feld wird sofort in der anderen reflektieren.

+0

IMO das ist DER Pascal Weg! Zum Nitpick sollte die Datensatzsyntax parens haben: 0: (Daten: Array [0..3] von AnsiChar); 1: (intSequenz: Ganzzahl); Und wegen der Endian-Spiel sollte die Reihenfolge umgekehrt werden: Sequence.data: = # $ b1 # $ 87 # $ 1C# $ 67; showmessage (Format ('% x', [sequence.intsequence])); –

+0

Gute Punkte. Ich habe die Antwort bearbeitet. –

+0

Sie könnten dies tun: Sequence.data: = # $ 67 # $ 1D # $ 87 # $ B1 {nicht umgekehrt}; Sequence.intSequence: = ntohl (Sequence.intSequence); ntohl kann in der Winsock-Einheit gefunden werden. Ein weiterer Vorteil ist, dass der Code mit nur einer Neuerstellung auf Nicht-Little-Endian-Prozessoren funktioniert. –

1

Warnung, keine Delphi Experte

Sie String-Manipulation nicht tun und nicht über ein Array von ganzen Zahlen verwenden.

Was Sie wollen, ist eine Zahl zu erhöhen, also tun Sie das! Eine Hexadezimalzahl steht für eine einzelne Ganzzahl, nicht für ein Array von ganzen Zahlen.

  1. Convert Hex String
  2. Increment Integer
  3. Convert Integer zu Hex String Integer

nicht mir Sie beklagen, dass dies ineffizient ist, ist es richtig, einfach und offensichtlich. So sollte Code sein.

Und wenn Ihre hexadezimale Zeichenfolge zu groß ist, um in eine Ganzzahl zu passen, dann gehen Sie weiter und verwenden Sie ein Array von ganzen Zahlen, stellen Sie sicher, dass Sie das kapseln, so wie es aussieht mit einem Typ.Anschließend können Sie testen dieses Array von Integer separat

1

geben denke ich, ich sehe, was wirklich vor sich geht hier:

Ich glaube, das Delphi 2009. Char ist eigentlich ein UnicodeChar, die eine variable ZWEI Byte ist.

Inkrementieren Sie das 4. Byte und was ändern Sie wirklich? Das niederwertige Byte des zweiten Zeichens - erzeugt genau die angezeigte Ausgabe. Hätten Sie dafür gesorgt, dass es hinter $ FF zurückfällt, hätten Sie ein ganz anderes Ergebnis gesehen!

Sorry, ich kann keine weiteren Informationen liefern, ich habe noch nicht aktualisiert.

Verwandte Themen