HexToBin delphi 7

Pagina: 1
Acties:
  • 181 views sinds 30-01-2008
  • Reageer

  • Geodan
  • Registratie: Maart 2003
  • Laatst online: 20-06-2025
ik heb een de variabele BinValue type string met 8 karakters
bv 11001001

nu wil ik de hex waarde weten van BinValue.

in de help staat
-----------
Delphi syntax:
procedure BinToHex(Buffer, Text: PChar; BufSize: Integer);
- Buffer is a buffer of bytes that contains the binary value.
- Text represents the value of Buffer as a hexadecimal number.
- BufSize is the size of Buffer.
--------------
ik heb nu :
BinToHex(PAnsiChar(BinValue), PAnsiChar(Hexvalue), 8 );

ik heb alle mogelijke manieren geprobeerd, maar steeds als ik de functie uitvoer loopt de applicatie vast.

weet iemand hier een oplossing voor?

ik zat al te denken aan een lookup table per 4 karakters
0000 = 0
0001 = 1
1111 = f

maar dat is niet echt mooi.

bij voorbaat dank B) 8)7

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Als welke type heb jij HexValue gedefineerd ?

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Binary is hier niet bedoelt als tekstuele weergave, maar echt als 1's en 0's. Met andere woorden: Buffer is geen string, maar een stuk geheugen. Je hebt dus niets aan die functie in dit geval.

/edit
Tis idd wel verwarrend dat Buffer hier als PChar aangegeven wordt, maar dat komt denk ik omdat die functie nooit echt voor het publiek bedoelt was. Hij bestaat al jaren, maar is pas in D7 gedocumenteerd.

[ Voor 66% gewijzigd door LordLarry op 23-04-2003 12:55 ]

We adore chaos because we like to restore order - M.C. Escher


  • Geodan
  • Registratie: Maart 2003
  • Laatst online: 20-06-2025
maar hoe komt het dan dat de functie HexToBin wel werkt?

function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer

  • Geodan
  • Registratie: Maart 2003
  • Laatst online: 20-06-2025
als String
dusty schreef op 23 April 2003 @ 12:30:
Als welke type heb jij HexValue gedefineerd ?

  • Mayco
  • Registratie: Augustus 2002
  • Laatst online: 02-03 22:35
Geodan schreef op 23 april 2003 @ 13:07:
maar hoe komt het dan dat de functie HexToBin wel werkt?

function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer
omdat die hex wel een pchar is

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
offtopic:
Je topci title is HexToBin terwijl we hier over BinToHex praten :p


Je kunt een eigen functie schrijven die de hexadecimale waarde berekend, dit is niet zo moeilijk. Neem een for loop die voor het aantal karakters in de string doorgelopen wordt (0 t/m length). Vermenigvuldig deze waarde (1 of 0) vervolgens met 2^i (twee tot de macht i) waar i de waarde is van de for-loop. Gebruik ror (rotate right) om de string telkens 1 door te schuiven...

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Geodan schreef op 23 April 2003 @ 13:07:
maar hoe komt het dan dat de functie HexToBin wel werkt?

function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer
Ja, compilen en draaien wel, maar komt er echt uit wat jij verwacht? Geef eens een voorbeeld dan...

We adore chaos because we like to restore order - M.C. Escher


  • Geodan
  • Registratie: Maart 2003
  • Laatst online: 20-06-2025
ik ben er al uit

function lookup(binString : string) : string;
begin
if binString = '0000' then
begin lookup := '0'; end
else if binString = '0001' then
begin lookup := '1'; end
else if binString = '0010' then
begin lookup := '2'; end
else if binString = '0011' then
begin lookup := '3'; end
else if binString = '0100' then
begin lookup := '4'; end
else if binString = '0101' then
begin lookup := '5'; end
else if binString = '0110' then
begin lookup := '6'; end
else if binString = '0111' then
begin lookup := '7'; end
else if binString = '1000' then
begin lookup := '8'; end
else if binString = '1001' then
begin lookup := '9'; end
else if binString = '1010' then
begin lookup := 'a'; end
else if binString = '1011' then
begin lookup := 'b'; end
else if binString = '1100' then
begin lookup := 'c'; end
else if binString = '1101' then
begin lookup := 'd'; end
else if binString = '1110' then
begin lookup := 'e'; end
else if binString = '1111' then
begin lookup := 'f'; end
end;

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

LordLarry schreef op 23 april 2003 @ 12:53:
[..]
Hij bestaat al jaren, maar is pas in D7 gedocumenteerd.
D6

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Geodan schreef op 23 April 2003 @ 14:24:
ik ben er al uit

function lookup(binString : string) : string;
begin
if binString = '0000' then
begin lookup := '0'; end
else if binString = '0001' then
begin lookup := '1'; end
[...]
else if binString = '1111' then
begin lookup := 'f'; end
end;
Ghehehe, mooi om het probleem heengewerkt....
Zoiets had ook gekund (C++ Builder) (en deze code zal ik in mijn eigen programma eerlijk gezegd iets netter uitwerken ;) ):
C++:
1
2
3
4
5
6
7
8
9
void __fastcall TForm1::Button1Click(TObject *Sender)
{       int result=0;
        int length=Edit1->Text.Length();
        for(int i=0;i<length;i++)
        {   char* binvalue = Edit1->Text.c_str();
            result = result + StrToInt(binvalue[length-1-i])*pow(2,i);
        }
        Edit2->Text = result;
}

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Probeer eens de CODE-tags te gebruiken, bovendien is je code uiterst oneffectief.

Er zijn verschillende manieren om dit op andere manieren op te lossen.

Bijvoorbeeld:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
function lookup(binString:String):String;
var
  hex:string;
  waarde:integer;
begin;
  hex:='0123456789abcdef';
  waarde:=1;
  if (midstr(binString,1,1)='1') then waarde:=waarde+8;
  if (midstr(binString,2,1)='1') then waarde:=waarde+4;
  if (midstr(binString,3,1)='1') then waarde:=waarde+2;
  if (midstr(binString,4,1)='1') then waarde:=waarde+1;
  lookup:=midstr(hex,waarde,1)+' '+inttostr(waarde);
end;

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Vind je dit niet erg onverstandig om te gaan reverse typecasten.

Je typecast je variabele on the fly stuurt de getypecaste variabele mee naar de functie en die functie gaat hem bewerken en geeft je variabele weer terug.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • killermar
  • Registratie: Augustus 2002
  • Laatst online: 27-03 10:00
Heb je dit al geprobeert:

SetLength(Hexvalue, 8 );
BinToHex(PAnsiChar(BinValue), PAnsiChar(Hexvalue[1]), 8 );
Pagina: 1