Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Binärcode <--> ASCII (https://www.delphipraxis.net/66280-binaercode-ascii.html)

ferby 27. Mär 2006 19:35


Binärcode <--> ASCII
 
Hallo,

ich habe einen String in dem nur 0 und 1 vorkommen. Dieser String ist durch 8 Teilbar und immer acht Zeichen stellen ein Zeichen aus der ASCII Tabelle dar. Jetzt wollte ich Fragen ob es eine einfache Möglichkeit gibt diesen 0 und 1 String in ASCII Zeichen zu verwandeln...

Ich hoff ihr versteht mein Problem.........


Bin dankbar für jede Hilfe,

Ferby

Klaus01 27. Mär 2006 19:50

Re: Binärcode <--> ASCII
 
sollte das nicht mit
Delphi-Quellcode:
bintoHex
und
Delphi-Quellcode:
char(strtoInt($Hex))
strtoInt('$A') gibt 10

gehen?

Grüße
Klaus

Eichhoernchen 27. Mär 2006 19:58

Re: Binärcode <--> ASCII
 
Hmm ich denke mal er will kein Hex, ich denke er will Dezimalzahlen hat:
Klar geht es auch mit Hexdezimalzahlen, jedoch anschaulich sind wohl eber die Dezimalzahlen, oder haste jemand schon mal ne Einkaufsliste mit A1 Tomaten geschrieben?


Edit: Ahh hast nen StrToInt hinzugefügt... geht das denn? kann ich StrToInt('A') machen und es kommt 10 raus?

Delphi-Quellcode:

0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7
1000 = 8
1001 = 9
1010 = 10
1011 = 11
1100 = 12
1101 = 13
1110 = 14
1111 = 15

marabu 27. Mär 2006 19:59

Re: Binärcode <--> ASCII
 
Falls die Binärzahl als String vorliegt, könnte das hier helfen:

Delphi-Quellcode:
function DualToStr(dual: String): String;
var
  i: integer;
  b: Byte;
  pcIn, pcOut: PChar;
begin
  SetLength(Result, Length(dual) div 8);
  pcIn := @dual[1];
  pcOut := @Result[1];
  b := 0;
  for i := 1 to Length(dual) do
  begin
    b := b shl 1 + Ord(pcIn^ <> '0');
    if i mod 8 = 0 then
    begin
      pcOut^ := Chr(b);
      b := 0;
      Inc(pcOut);
    end;
    Inc(pcIn);
  end;
end;
Grüße vom marabu

Eichhoernchen 27. Mär 2006 20:11

Re: Binärcode <--> ASCII
 
sieht ja nett aus aber warum Pointer nutzen??
Ich meine man könnte doch einfach die Laufvariable i nehmen und die Strings direkt anquatschen!


Und warum der Ergebnisvariablen eine länge gebne?

Delphi-Quellcode:
SetLength(Result, Length(dual) div 8);

So irgendwie:

Delphi-Quellcode:
function DualToStr(dual: String): String;
var
  i: integer;
  b: Byte;
begin
  b := 0;
  for i := 1 to Length(dual) do
   begin
     b := b shl 1 + Ord(dual[i] <> '0');
     if i mod 8 = 0 
       then begin
             result[i div 8] := Chr(b);
             b := 0;
            end;
   end;
end;

marabu 27. Mär 2006 21:27

Re: Binärcode <--> ASCII
 
Hallo Eichhoernchen,

von den Zeigern hatte ich mir einen Geschwindigkeitsvorteil versprochen, aber dann kam mir ein längerer Aufenthalt in der heimischen Keramikausstellung dazwischen. Das Setzen der Länge sollte schon sein, aber um niemanden mehr mit den Zeigern zu verwirren, hier eine Version, welche auch mit krummen Längen des dualen Strings zurecht kommen sollte:

Delphi-Quellcode:
function DualToStr(dual: String): String;
var
  i, iResult, iLen, iOffset: integer;
  b: Byte;
begin
  iLen := Length(dual);
  iOffset := iLen mod 8;
  SetLength(Result, iLen div 8 + Ord(iOffset > 0));
  b := 0;
  iResult := 0;
  for i := 1 to iLen do
  begin
    b := b shl 1 + Ord(dual[i] <> '0');
    if i mod 8 = iOffset then
    begin
      Inc(iResult);
      Result[iResult] := Chr(b);
    end;
  end;
end;
Gute Nacht

marabu

Eichhoernchen 27. Mär 2006 22:04

Re: Binärcode <--> ASCII
 
War jetzt kein gemeckere, wollte eben nur fragen, wir haben im Informatikunterricht gerade auch Zeiger und Listen durchgenommen und habe jetzt auch endlich den Sinn dahinter verstanden. Hatte mich eben nur gefragt warum man das so machen sollte wo Delphi einem doch das eben alles abnimmt!

Boombuler 28. Mär 2006 07:43

Re: Binärcode <--> ASCII
 
Hi,

Zitat:

Zitat von Eichhoernchen
Hmm ich denke mal er will kein Hex, ich denke er will Dezimalzahlen hat:
Klar geht es auch mit Hexdezimalzahlen, jedoch anschaulich sind wohl eber die Dezimalzahlen, oder haste jemand schon mal ne Einkaufsliste mit A1 Tomaten geschrieben?

Frag mich sowieso was du mit 161 Tomaten willst!

Tatsache ist bei dem ersten Lösungsansatz nur das man weder die Dezimal noch die Hex Zahl jemals zu gesicht bekommen würde und da die sowieso in gleicher Form im Speicher liegen macht das relativ wenig Unterschied! ;)

Muss dann also jeder selber wissen wie er es Anzeigen will !

Greetz Boombuler

ferby 29. Mär 2006 13:59

Re: Binärcode <--> ASCII
 
Hallo,

danke für die ganzen Antworten, ich habe mir eure Lösungsvorschläge angeschaut, leider konnte ich jetzt zwei Tage nicht ins Internet und habe mir meine eigene Lösung geschrieben... zumindest versucht.

Bei mir kommt die Fehlermeldung:
[Fehler] TypUmwandlungen.pas(109): Inkompatible Typen: 'Char' und 'ShortString'

Hier der Quellcode:

Delphi-Quellcode:
function BitToAsc(Bit :AnsiString): AnsiString;
var
  i:integer;
begin
  result:='';

  // Zuerst die Zahl auf durch 8 Teilbar bringen
  while length(Bit) mod 8 <> 0 do Bit:=Bit + '0';

  // Dann immer 8 Bit Werte in einen ASCII Wert umwandeln
  for i:=1 to (length(bit) div 8) do
  result[i]:=result[i] + char(1 + BitToInt(Bit[1+(i-1)*8] + Bit[2+(i-1)*8] + Bit[3+(i-1)*8] + Bit[4+(i-1)*8] + Bit[5+(i-1)*8] + Bit[6+(i-1)*8] + Bit[7+(i-1)*8] + Bit[8+(i-1)*8])); // In dieser Zeile kommt die Fehlermeldung
end;

function BitToInt(Bit: string):integer;
var
i, zahl: integer;
begin
  result:=0;
  zahl:=1;

  for i:=1 to length(bit) do
  begin
    if strtoint(bit[i])=1 then result:=result + zahl;
    inc(zahl,zahl);
  end;
end;

Ich hoffe das der Quellcode, wenn der eine Fehler behoben ist, funktioniert... habe ihn leider noch nicht testen können, aber aus meiner Sicht müsste er hinhauen.....

Kann mir jemand sagen warum dieser Fehler kommt? Wiso kann ich einen String kein Chat zuordnen, das es anders rum nicht geht ist logisc, aber das es so nicht geht wie ich es gemacht habe kapier ich nicht.....

Ferby

Klaus01 29. Mär 2006 14:18

Re: Binärcode <--> ASCII
 
anstelle von diesem

Delphi-Quellcode:
 for i:=1 to (length(bit) div 8) do
  result[i]:=result[i] + char(1 + BitToInt(Bit[1+(i-1)*8] + Bit[2+(i-1)*8] + Bit[3+(i-1)*8] + Bit[4+(i-1)*8] + Bit[5+(i-1)*8] + Bit[6+(i-1)*8] + Bit[7+(i-1)*8] + Bit[8+(i-1)*8])); // In dieser Zeile kommt die Fehlermeldung
mal dies probieren

Delphi-Quellcode:
 for i:=1 to (length(bit) div 8) do
  result:=result + char(1 + BitToInt(Bit[1+(i-1)*8] + Bit[2+(i-1)*8] + Bit[3+(i-1)*8] + Bit[4+(i-1)*8] + Bit[5+(i-1)*8] + Bit[6+(i-1)*8] + Bit[7+(i-1)*8] + Bit[8+(i-1)*8])); // In dieser Zeile kommt die Fehlermeldung

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 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