Autor Beitrag
fuba
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Mi 21.11.07 07:13 
hi,

Nehmen wir mal man, mein HEX code ist dieser: $000133FF als Fixwert.

Bzw -> 00 01 33 FF

Nun kommt ne schleife.
In dieser soll nach jedem durchlauf, die Stelle wo jetzt $33 steht aus 000133FF um $05 (also HEX 5) erhöhen werden.

Beispiel:
Schleife hat 3 durchgänge:
Durchgang 1 -> aus $000133FF wird $000138FF
Durchgang 2 -> aus $000138FF wird $00013DFF
Durchgang 3 -> aus $00013DFF wird $000142FF

also meine anfangszahl ist $000133FF und meine endzahl währe dann $000142FF

3x$5 = $0F also $33 + $0F = $42

deswegen wird aus $000133FF auch $000142FF

aber egal was passiert, es soll IMMER die stelle, wo mal 33 war verändert werden.

Gibts da ne einfache variante?


Moderiert von user profile iconjasocul: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 21.11.2007 um 08:06
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mi 21.11.07 08:07 
Wo ist das Problem?
(1) Stelle suche -> merken
(2) Schleife

oder
(1) Schleife
(2) Stelle+5*I suchen -> ändern

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 21.11.07 08:11 
Hat das einen besonderen Grund, warum Du nicht gleich um $0F erhöhst?

Falls Du es wirklich in 3 Durchläufen machen musst, dann musst Du Dir im ersten Durchlauf alle Stellen merken. Dafür bietet sich z.B. ein dynamisches Array an.
fuba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Mi 21.11.07 08:56 
Zitat:

Wo ist das Problem?
(1) Stelle suche -> merken
(2) Schleife

oder
(1) Schleife
(2) Stelle+5*I suchen -> ändern



wie soll ich das machen?

die HEX Zahl $000133FF ist nur ein beispiel, was währe wenn die HEX Zahl aber 00111111 ist, dann hätte ich 3 stellen die 11 enthalten -> 00 11 11 11

wie soll ich das machen, genau diesen wer immer zu erhöhen -> 00 11 11 11 ?

weil wenn ich den Wert: 00 11 11 11 um 1 erhöhe, sollte dann 00 11 12 11 rauskommen.

Nechste runde will ich 00 11 12 11 um 1 erhöhen -> also auf 00 11 13 11
usw..

wobei der wert "1" um den ich erhöhen will nur ne "Hausnummer" ist, dies kann auch 2,3,4 oder gar AF, 1F, oder ähnliches sein.

Aber nur DER eine wert soll erhöht werden, das will ich damit genau fragen :)

Sorry wenn ich das etwas unverständlich schreibe!

Zitat:

Hat das einen besonderen Grund, warum Du nicht gleich um $0F erhöhst?

Falls Du es wirklich in 3 Durchläufen machen musst, dann musst Du Dir im ersten Durchlauf alle Stellen merken. Dafür bietet sich z.B. ein dynamisches Array an.


Ne ich könnte genausogut auch gleich um $0F erhöhen, oben hab ich das nur als beispiel geschrieben, um allen klar zu machen, ich möchte IN JEDEM FALL nur diese stelle (anfangs 33) erhöhen.
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mi 21.11.07 09:12 
Steht die Zahl (4Byte) denn wenigstens immmer auf einer Position für die (Position mod 4)=0 ist? Ansonsten sehe ich schwarz!

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 21.11.07 09:59 
Wenn Du nicht alle gleichen Werte verändern willst, sondern nur einen, obwohl noch andere gleiche existieren, dann musst Du vorher wissen, wo er steht. Ansonsten kannst Du den zu ändernden Wert ja nicht mal finden.
fuba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Mi 21.11.07 10:13 
user profile iconKroko hat folgendes geschrieben:
Steht die Zahl (4Byte) denn wenigstens immmer auf einer Position für die (Position mod 4)=0 ist? Ansonsten sehe ich schwarz!


wenn du damit meinst, ob die selle an der 33 anfangs stand, immer an der stelle bleibt, egal ob diese über FF oder unter FF geht, dann ja.

also:
anfangs -> 00 11 11 11

nach xx erhöhung -> 00 11 xx 11

xx bleibt immer an der gleichen stelle und wander nicht einen wert vor.
also wird nicht zu: 01 1x x1 11

gelöst ahbe ich das ganze ja schon, ABER die lösung gefällt mir garnicht, keine ahnung warum, aber ich hab nen schlechtes gefühl dabei :D

Hier wird der HEXCode aber nicht gesplittet übergeben also nicht 00 11 11 11 sondern 00111111.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function test(aHexCode: string): string;
var
  HexBH: string;
  DecBH, myPos: integer;
begin
  myPos:=Length(aHexCode)-3;
  HexBH := copy(aHexCode, myPos, 2);        // meine $11 rausholen
  DecBH := StrToInt('$'+HexBH) -$17;        // meine $11 mit $17 subtrahieren
  HexBH := format('%x', [DecBh]);           // meine $11 - $11 = FA in string wandeln wobei hier eigentlich FFFFFFFA rauskommt

  if Length(HexBH) > 2 then                 // wenn die Länge von HexBH größer als 2 ist
  Delete(HexBH, 1, Length(HexBH)-2);        // wird alles, bis auf die letzen 2 Zeichen gelöscht (also hier alles bis auf FA)
  Delete(aHexCode, myPos, 2);               // die stelle wo vorhin meine $11 waren löschen
  insert(HexBH, aHexCode, myPos);           // meine $FA da einfügen wo vorhin $11 war

  result := aHexCode;
end;


Das is ein wenig komplizierter, da ich in meiner funktion nicht addiere sondern subtrahiere ;)
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mi 21.11.07 10:28 
Und warum wandelst du die Hex-werte in Strings um? Die kommen doch sicherlich aus einer Datei/einem Stream, Lies diese in ein array of Byte, bestimme die Position und ändere den entsprechenden Wert mit Inc/Dec!

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
fuba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Mi 21.11.07 10:58 
user profile iconKroko hat folgendes geschrieben:
Und warum wandelst du die Hex-werte in Strings um? Die kommen doch sicherlich aus einer Datei/einem Stream, Lies diese in ein array of Byte, bestimme die Position und ändere den entsprechenden Wert mit Inc/Dec!


und da haben wir den salat :P
ich hab NULL ahnung von arrays :(

warum ich das so macht -> HEX to String ist genau deswegen...

aber das gefällt mir schon sehr gut, ich meine die idee alleine :)

was muss ich aber bei arrays beachten bzw was muss ich tun um das zu verstehen?
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mi 21.11.07 13:27 
(1) Du kennst die Länge der Arrays schon zur Programmierung -> statisches Array ->
ausblenden Delphi-Quelltext
1:
2:
3:
4:
type
  TMyArray = array[0..Laenge-1of Byte;
var
  A: TMyArray;

oder
(1) Du kennst die Länge des Arrays erst während der Laufzeit -> dynamisches Array ->
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type
  TMyArray = array of Byte;
var
  A: TMyArray;

procedure InitArray(const ALen: Integer);
begin
  SetLength(A,ALen);
end;

procedure DoneArray;
begin
  Finalize(A);
end;


so dass war es schon der Zugriff erfolgt in beiden Fällen über
ausblenden Delphi-Quelltext
1:
A[0] := 100;					

und schaust Du dort

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
fuba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Mi 21.11.07 17:18 
hmm, eine frage noch

wie bekommte ich den gesammten code aus einem array raus?

mein statisches array ist:
array[0..3] of byte

Key[0]:=$00;
Key[1]:=$01;
Key[2]:=$11;
Key[3]:=$11;

rechenvorgang funzt auch.

aber wenn ich jetzt den gesammten KEY haben will, sollte dieser dann (unbearbeitet) $00011111 sein... nur wie?

ich kann den zwar mit:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
s:=''
for i:=0 to high(key) do
begin
  s:=s+IntToHex(Key[i],2);
end;

rausholen, aber so soll das ja auch nicht sein oder?
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mi 21.11.07 17:41 
so
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function ArrayToKey(const A: array[0..3of Byte): Cardinal; // 4 Byte
var
  I: Integer;  
begin
  Result := 0;
  for I := 0 to 3 do
  begin
    Result := (Result shl 8or A[I];
  end;
end;

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
fuba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Mi 21.11.07 19:07 
danke dir, deine funktion funzt
zwar musste ich bei array die [0..3] wegnehmen, aber es geht :D

nur jetzt hab ich bemerkt, ich hab doch nen fehler in meiner routine...

und zwar:

KEY[2]:=$11
KEY[3]:=$11

wenn ich KEY[3] um ff erhöhe bekomme ich 110 und dann sollte ich KEY[2] auf 12 erhöhen wobei KEY[3] 10 wird.

Das passiert aber nicht, weil ich ier nur mit den einzellnen array rechne, und nicht mit dem gesammten.

was ich eigentlich will:

FFFFFFFF aufteilen in FF FF FF FF und jede einzellne stelle extra rechnen können,
aber sollte eine stelle über FF gehen die nächste stelle mit einbezogen werden.

dachte nicht dass das so schwer wird :/
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mi 21.11.07 19:15 
dann lass es mit dem Array und nimm ein Cardinal und
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  A := A+AByte ; //4.Stelle
  A := A+($100*AByte); //3.Stelle
  A := A+($10000AByte); //2.Stelle
  A := A+($1000000*AByte); //1.Stelle

ungetestet ev. musst Du AByte erst einem Cardinal zuweisen

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
fuba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Do 22.11.07 06:54 
user profile iconKroko hat folgendes geschrieben:
dann lass es mit dem Array und nimm ein Cardinal und
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  A := A+AByte ; //4.Stelle
  A := A+($100*AByte); //3.Stelle
  A := A+($10000*AByte); //2.Stelle
  A := A+($1000000*AByte); //1.Stelle

ungetestet ev. musst Du AByte erst einem Cardinal zuweisen


das funktioniert wenn ich den ganzen hex in der rechenroutine verwenden will, aber nicht wenn ich nur 1 byte hex ändern will.

----

Meine neue idee:
Da mich das array of byte schonmal näher gebracht hat, dachte ich mir:

1.)
array of byte deffinieren -> is klar

2.)
normaler rechenvorgang mit hex plus hex -> 00011111 + FF = 00011210 -> is klar
(hier will ich ja noch die GANZE hexzahl ändern, also wenn eine Zahl größer ist als FF darf diese überspringen)

3.)
HexZahl welche bei mir 00011210 ist, in array of byte laden. -> keine ahnung wie?
sodas diese gesplittet ist also würde ich es per hand ins array eintragen.
Sollte dann circa so aussehen:

Ganzes Array = 00111210

array[0]:=$00;
array[1]:=$01;
array[2]:=$12;
array[3]:=$10;


4.)
array[3] welches dann $12 sein soll minus $22 rechnen was dann $F0 erbibt, da das ergbinis nicht überspringen kann.

5.)
dann wieder array of byte (das komplette) in eine ganze zahl speichern (integer oder cardinal).
dafür hast du mir ja schon die funktion geopstet und diese funktioniert auch!

----
Das problem liegt jetzt alleine an dem:
Wie bekomme ich meine GANZE HEXZahl (00011210), geteilt in ein array of byte?

Wenn ich das schaffe, dann sollte das ganze funktionieren.

P.S
Tut mir echt leid dich damit so lange zu quelen... :)

PPS.
Konnte gestern nicht mehr zurückschreiben, war völlig tot am abend :P
fuba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Do 22.11.07 10:18 
so, hab das jetzt geschafft.

Hex in array of byte speichern wie ich es mir dachte, also so:

00012233 in array of byte:

array[1]:=$00;
array[2]:=$01;
array[3]:=$22;
array[4]:=$33;

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
var
  a: array of byte;

implementation

{$R *.dfm}

...

var
  tempStr, Hex: string;
  i, len: integer;
begin
  Hex:='EE01FF44';

  Len := Length(Hex) div 2;
  SetLength(a, Len+1);
  for i := 1 to Len do
  begin
    tempStr:='$'+copy(Hex, i*2-12);
    a[i]:=byte(StrToInt(tempStr));
  end;
end;


und wieder zurück in cardinal bzw von chardinal nach HexString:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  c, i: integer;
  Hex: string;
begin
  for i:=low(a) to high(a) do
  begin
    c:= (c shl 8or a[i];
  end;
  hex:=IntToHex(c, 8);


nur verstehe ich noch nicht, was genau dein code macht.
also das hier:

ausblenden Delphi-Quelltext
1:
c:= (c shl 8or a[i];					


kannst du mir das genauer beschreiben?

ich weis zwar SHL bedeuter, das du (hier "c") um 8 stellen nach links verschiebst.

aus der Delphi-Hilfe:
ausblenden Quelltext
1:
2:
3:
SHL
Logische Linksverschiebung.
Beide Ausdrücke müssen absolute, direkte Werte sein. Das Ergebnis ist ebenfalls ein absoluter direkter Wert.

aber warum machst du das und was mach das OR?

habe zwar aus der Delphi-Hilfe das:
ausblenden Quelltext
1:
2:
3:
OR
Bitweises OR.
Beide Ausdrücke müssen absolute, direkte Werte sein. Das Ergebnis ist ebenfalls ein absoluter direkter Wert.

aber das versteh ich nicht.

_________________
mfg. fuba
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Do 22.11.07 11:50 
(1) zu SHL mal Bitweise aufgesplittet
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
 
A := 1;       // A := 0000 0000 0000 0001b = 1
B := A shl 1// B := 0000 0000 0000 0010b = 2
C := A shl 2// C := 0000 0000 0000 0100b = 3
D := A shl 8// D := 0000 0001 0000 0000b = 256
usw. usf.
d.h shl 8 entspricht einer Multiplikation mit $100=256, nur eben schneller
(2) entpricht dem logischen OR nur Bitweise, man kann auch den Wert addieren, da nach dem shl 8 rechts die 8 Bits = 0 sind
ausblenden Delphi-Quelltext
1:
2:
3:
4:
A := 2;       // A := 0000 0000 0000 0010b = $002
B := A shl 8// B := 0000 0010 0000 0000b = $200
C := B or $34;// C := 0000 0010 0011 0100b = $234
D := B + $34// D := 0000 0010 0011 0100b = $234

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
TProgger
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 148

XP
D6, D2007 prof
BeitragVerfasst: Do 22.11.07 11:58 
Der einfachste Weg wäre doch, die Zahl als Ganzes zu nehmen (Cardinal).
Hexwert in Zahl umwandeln:
ausblenden Delphi-Quelltext
1:
StrToInt('$'+HexString);					

Will man die linken zwei Stellen erhöhen, addiert man zur Zahl z.B. 3 * 1048576. (Ergebnis in Hex: 03000000).
Will man die nächsten zwei Stellen erhöhen, addiert man zur Zahl z.B. 3 * 65536. (Ergebnis in Hex: 00030000).
Will man die nächsten zwei Stellen erhöhen, addiert man zur Zahl z.B. 3 * 256. (Ergebnis in Hex: 00000300).
Will man die rechten zwei Stellen erhöhen, addiert man zur Zahl einfach den Wert, z.B. 3. (Ergebnis in Hex: 00000003).
Vorteil: man brauch nur mit einer ganzen Zahl zu arbeiten und IntToHex liefert dann wieder die Hex-Anzeige.
ausblenden Delphi-Quelltext
1:
IntToHex(Zahl,8);					

_________________
Wir haben für jede Lösung das richtige Problem ;)
fuba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Do 22.11.07 12:12 
achso, das ist schon ein bisschen verständlicher :)

aber wenn dem so ist, hast du nen schreibfehler :D

dein code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
A := 1;       // A := 0000 0000 0000 0001b = 1
B := A shl 1// B := 0000 0000 0000 0010b = 2
C := A shl 2// C := 0000 0000 0000 0100b = 3  -> dann müsste das 4 sein oder?
D := A shl 8// D := 0000 0001 0000 0000b = 256

// mein zusatz
E := A shl 4  // müsste dann 16 sein oder?


--

und das OR ist im prinzip ne einfache addition oder kann ich z.b:

$1000 or 10 = $1000 +$10 ?

oder muss ich das wie ein einfaches PLUS handhaben, also:

$1000 or $10 = $1000 + $10 ?
fuba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Do 22.11.07 12:20 
user profile iconTProgger hat folgendes geschrieben:
Der einfachste Weg wäre doch, die Zahl als Ganzes zu nehmen (Cardinal).
Hexwert in Zahl umwandeln:
ausblenden Delphi-Quelltext
1:
StrToInt('$'+HexString);					

Will man die linken zwei Stellen erhöhen, addiert man zur Zahl z.B. 3 * 1048576. (Ergebnis in Hex: 03000000).
Will man die nächsten zwei Stellen erhöhen, addiert man zur Zahl z.B. 3 * 65536. (Ergebnis in Hex: 00030000).
Will man die nächsten zwei Stellen erhöhen, addiert man zur Zahl z.B. 3 * 256. (Ergebnis in Hex: 00000300).
Will man die rechten zwei Stellen erhöhen, addiert man zur Zahl einfach den Wert, z.B. 3. (Ergebnis in Hex: 00000003).
Vorteil: man brauch nur mit einer ganzen Zahl zu arbeiten und IntToHex liefert dann wieder die Hex-Anzeige.
ausblenden Delphi-Quelltext
1:
IntToHex(Zahl,8);					


sollte die zahl über oder unter FF gehen, also:
sagn wir mal ich habe in HEX:

22FA3333

jetzt addiere ich zu den FA mal $07 dazu, würde ja die zahl dann so aussehen:

23013333

also kurz:

22FA3333 + 00070000 = 23013333

und genau das will ich nicht.

so wie ich es mache, sieht dann die zahl so aus: 22013333

weil ich nur die stelle erhöche, wo vorher FA war und nicht die nähste auch noch.