Delphi-PRAXiS

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.

p80286 29. Mär 2017 21:05

AW: Hexadezimal < > 8 bits
 
Delphi-Quellcode:
const
  HX  : array [0..15] of ansichar='0123456789ABCDEF';


function HXTRANS(ib:byte):ansistring;
begin
  result:=' ';
  result[1]:=HX[ib shr 4];
  result[2]:=HX[ib and $0F];
end;
Gruß
K-H

stay 30. Mär 2017 18:29

AW: Hexadezimal < > 8 bits
 
Das sieht sehr gut aus, damit bekomme ich aus 0xff ein byte mit 1111 1111 oder?

Delphi-Laie 30. Mär 2017 18:47

AW: Hexadezimal < > 8 bits
 
Zitat:

Zitat von stay (Beitrag 1365901)
if Bit7.checked = true then i := i +1;

[...]

Bitte nicht auslachen, mir gefällt es selbst nicht.

Mir auch nicht. Sofort stieß mir "Bit7.checked = true" und ff. auf. Probiere mal aus, was passiert, wenn Du "= true" und ff. wegläßt.
Für i:=i+1 gibt es auch den Inkrementor inc(i).

himitsu 30. Mär 2017 19:41

AW: Hexadezimal < > 8 bits
 
Zitat:

Zitat von stay (Beitrag 1366018)
Das sieht sehr gut aus, damit bekomme ich aus 0xff ein byte mit 1111 1111 oder?

Nein?

Aus einem Byte mit $FF wird natürlich ein String mit 'FF'. :stupid:

p80286 31. Mär 2017 12:02

AW: Hexadezimal < > 8 bits
 
Zitat:

Zitat von stay (Beitrag 1366018)
Das sieht sehr gut aus, damit bekomme ich aus 0xff ein byte mit 1111 1111 oder?

0xFF=0b11111111=255

warum kennen so viele die kleinsten Grundlagen nicht?

Gruß
K-H

stay 31. Mär 2017 14:39

AW: Hexadezimal < > 8 bits
 
Zitat:

Zitat von p80286 (Beitrag 1366058)
Zitat:

Zitat von stay (Beitrag 1366018)
Das sieht sehr gut aus, damit bekomme ich aus 0xff ein byte mit 1111 1111 oder?

0xFF=0b11111111=255

warum kennen so viele die kleinsten Grundlagen nicht?

Gruß
K-H

Das Umrechnen per Hand kann ich, allerdings nicht, wie es das Programm macht. Da Lazarus nicht so eine Große Verbreitung hat wie VS gibt es auch weniger Tutorials... Trotzdem gefällt mir Lazarus und deshalb kommen so doofe Fragen manchmal :oops:

Neutral General 31. Mär 2017 14:52

AW: Hexadezimal < > 8 bits
 
Zitat:

Zitat von stay (Beitrag 1366075)
Das Umrechnen per Hand kann ich, allerdings nicht, wie es das Programm macht. Da Lazarus nicht so eine Große Verbreitung hat wie VS gibt es auch weniger Tutorials... Trotzdem gefällt mir Lazarus und deshalb kommen so doofe Fragen manchmal :oops:

Das ist im Prinzip sprachunabhängiges Wissen. Das Prinzip ist in jeder Sprache das Gleiche.

stay 1. Apr 2017 20:45

AW: Hexadezimal < > 8 bits
 
Ich bedanke mich ganz herzlich bei euch :)
Mir gefällt die IDE immer mehr. Schade dass ich die Hochzeit dieser Sprache verpasst habe.
Grüße

Rollo62 2. Apr 2017 10:35

AW: Hexadezimal < > 8 bits
 
Die Hoch-zeit kommt noch :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 Uhr.

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