Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Hexadezimal < > 8 bits (https://www.delphipraxis.net/192214-hexadezimal-8-bits.html)

stay 29. Mär 2017 18:20

Hexadezimal < > 8 bits
 
Hallo :)

ich bin zwar immer noch an meiner GUI dran, muss jedoch nebenbei auch an der Funktion arbeiten.

Ich habe 8 Bits in eine Hexadezimalzahl umgewandelt und umgekehrt, es funktioniert, aber es gefällt mir überhaupt nicht. Würdet ihr euch mal kurz meine 2 Funktionen angucken und mir helfen sie zu verbessern? :)

Die checkbox ist hierbei als bit zu sehen. die hexadezimal ist immer 2-stellig.

Zitat:

i := 0;
if Bit7.checked = true then i := i +1;
if Bit6.checked = true then i := i +2;
if Bit5.checked = true then i := i +4;
if Bit4.checked = true then i := i +8;
if Bit3.checked = true then i := i +16;
if Bit2.checked = true then i := i +32;
if Bit1.checked = true then i := i +64;
if Bit0.checked = true then i := i +128;
Label1.Caption:='Int-Wert: ' + inttostr(i);
h := 'i2cset -y 1 0X24 0x' + inttohex(i,2);
Zitat:

i := strtoint(string HEX);
if i >= 128 then
begin Bit10.checked := true; i := i-128; end
else Bit10.checked := false;
if i >= 64 then
begin Bit11.checked := true; i := i-64 end
else Bit11.checked := false;
if i >= 32 then
begin Bit12.checked := true; i := i-32 end
else Bit12.checked := false;
if i >= 16 then
begin Bit13.checked := true; i := i-16 end
else Bit13.checked := false;
if i >= 8 then
begin Bit14.checked := true; i := i-8 end
else Bit14.checked := false;
if i >= 4 then
begin Bit15.checked := true; i:= i-4 end
else Bit15.checked := false;
if i >= 2 then
begin Bit16.checked := true; i := i-2 end
else Bit16.checked := false;
if i >= 1 then Bit17.checked := true
else Bit17.checked := false;
Bitte nicht auslachen, mir gefällt es selbst nicht.

Danke

DeddyH 29. Mär 2017 18:27

AW: Hexadezimal < > 8 bits
 
Hilft Dir mein Tutorial weiter? Denn eigentlich brauchst Du doch nur das binäre UND zum Auswerten und das binäre ODER zum Setzen der Bits.

stay 29. Mär 2017 18:48

AW: Hexadezimal < > 8 bits
 
Bin mir nicht sicher, werde deinen Link genauer angucken müssen.

Also ich brauche 8 Bits aus verschiedenen Funktionen, die ich dann zusammen setze. oder andersrum.
Kann ich in Lazarus 8 Bits zu einem byte umwandeln? Und dafür müsste ich die Hexadezimal erstmal in byte umwandeln :/

Danke schonmal

DeddyH 29. Mär 2017 18:50

AW: Hexadezimal < > 8 bits
 
8 Bits SIND ein Byte, da gibt es nichts umzuwandeln ;). Ich kann mir aber denken, was Du meinst.

stay 29. Mär 2017 18:56

AW: Hexadezimal < > 8 bits
 
:D Also ich brauche 8 Boolean statt ein B01010101 Wert am Ende.

DeddyH 29. Mär 2017 18:57

AW: Hexadezimal < > 8 bits
 
Und wenn man bedenkt, dass man einen Boolean auch als 0 für false und 1 für true sehen kann, was fällt Dir dann an Deiner "Binärzahl" auf?

stay 29. Mär 2017 19:50

AW: Hexadezimal < > 8 bits
 
Ja xD 8bit - 1 byte - 0,5 word.

Wollte nur sicher gehen, dass es mir wichtig ist 8 getrennte bits in einen byte zusammen zu führen für deinen link. Und das auch in der Richtigen Reihenfolge. Du siehst an meiner Lösung, dass ich es selbst nicht elegant lösen konnte :/

himitsu 29. Mär 2017 20:12

AW: Hexadezimal < > 8 bits
 
Erstmal zu
Delphi-Quellcode:
if Bit7.checked = true then
.
Diese Konstanten sollte man immer nur für Zuweisungen, aber niemals für Vergleicher verwenden,
denn wie bereits bemerkt, besteht ein Delphi-Boolean intern aus einem Byte, wo es 1 Mal das False und 255 Mal ein True Nicht-False gibt.
und bei einem LongBool hast du den Spaß sogar mit 4.294.967.295 Mal dem "True".

Delphi-Quellcode:
i := i + 1;

Wenn man "Binär" rechnen will, dann natürlich mit binären Operatoren ala OR und AND und nicht mit arithmetischen Operatoren ala ADD (+),
denn
Delphi-Quellcode:
B := B or $01; // oder 1
arbeitet immer richtig, aber ein
Delphi-Quellcode:
B := B + $01; // oder 1
macht Probleme, wenn dieses Bit bereits gesetzt ist.
Aber dafür hast'e ja nun das Tutorial.

Delphi-Quellcode:
var B: Boolean;

B := Boolean(3); // die Variable könnte mal ausversehn mit einem "unschönen" True aus irgendeiner Funktion raus kommen.

if B = True then ShowMessage('Falsch: True');
if B = False then ShowMessage('Falsch: False');

if B then ShowMessage('Richtig: True');
if not B then ShowMessage('Richtig: False');

PS: TCheckListBox und eine For-Schleife über alle Bits/CheckBoxen.

stay 29. Mär 2017 20:51

AW: Hexadezimal < > 8 bits
 
Das macht natürlich Sinn. Hupps. Unabhängig von der Bit Verarbeitung, da muss ich mich erst mal reindenken. Kann ich in lazarus “relativ“ einfach ein byte in eine 2stellige hexadezimal Zahl umwandeln?
IntToHex( x,y ) war ja perfekt, direkt y für 2 Stellen nutzen

himitsu 29. Mär 2017 21:03

AW: Hexadezimal < > 8 bits
 
Das sollte in Lazarus wie im Delphi funktionieren .... uralte APIs, das hatte Lazarus/FreePascal zu Beginn fast alles 1:1 übernommen.

Es gibt noch BinToHex (aber Achtung, da ist die Bytefolge anders)
und Format kann auch Hexadezimal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz