Einzelnen Beitrag anzeigen

Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Binär in Hexadizmal

  Alt 18. Sep 2007, 17:47
Zitat von Arthur:
also so läuft es
aber nur das ich es mit einer for oder while schleife machen soll.....
und in der hilfe kann ich nicht nachschauen, da windows vista die nicht unterstützt..
Die For / While Schleife benötigst du trotzdem...

Bye Christian

Edit:
Ich hab mal ein wenig rumgestöbert, da ich damals ganz am Anfang zu meiner Ausbildungszeit sowas programieren mußte...
Hab jetzt einfach mal das wichtigste C&P aus dem Src, ka ob das funktionstüchtig ist, auf dem ersten Blick sollte alles bei sein.


Delphi-Quellcode:
Uses
  SysUtils, Math;

Type
  TNumeralSystem = ( nsBin, nsDec, nsHex ); // Unsere Zahlensysteme

Const
  cDisplayDigits: Array[ 0..15 ] Of Char = ( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' ); // Buchstaben alle klein!

Function GetNSSize( Const NummeralSystem: TNumeralSystem ): Integer;
//** Wieviel Zahlen hat das System
Begin
  Case NummeralSystem Of
    nsBin: Result := 2;
    nsDec: Result := 10;
    nsHex: Result := 16;
    Else Result := -1;
  End;
End;

Function CheckNSString( Const NumeralSystemString: String; Const NummeralSystem: TNumeralSystem ): Boolean;
//** entspricht der String der Notation des Zahlensystems (Ungültige Zeichen???)
Var i: Integer;
    a: Integer;
    ConvStr: String;
    IOResult: Boolean;
Begin
  Result := False;
  If Length( NumeralSystemString ) > 0 Then Begin
    ConvStr := LowerCase( NumeralSystemString ); // Großbuchstaben zu Kleinbuchstaben wandeln
    IOResult := False;
    For i := 1 To Length( ConvStr ) Do Begin // Jedes Zeichen des übergeben Strings durchgehen
      IOResult := False;
      For a := 0 To GetNSSize( NummeralSystem ) - 1 Do Begin // cDisplayDigits durchgehen
        IOResult := ConvStr[ i ] = cDisplayDigits[ a ];
        If IOResult Then Break; // For Schleife abbrechen wenn Zeichen übereinstimmen
      End;
      If Not IOResult Then Break; // Abbrechen wenn ein Zeichen nicht gefunden wurde...
    End;
    Result := IOResult;
  End;
End;

Function GetDecValue( Const aChar: Char ): Integer;
//** Zeichen zu dezimalen Wert
Var i: Integer;
    FoundOne: Boolean;
Begin
  Result := -1;
  For i := Low( cDisplayDigits ) To High( cDisplayDigits ) Do Begin
    FoundOne := cDisplayDigits[ i ] = aChar;
    If FoundOne Then Begin
      Result := i;
      Break;
    End;
  End;
  If Not FoundOne Then Raise EConvertError.Create( 'Wert für das Numerische Zeichen: "' + aChar + '" kann nicht ermittelt werden' );
End;

Function ConvertToDec( Const SrcNumStr: String; Const SrcNumSys: TNumeralSystem ): Int64;
//** Konvertiert eine Zahl eines Systems zu einer Dezimalzahl
Var ConvStr: String;
    Len: Integer;
    i: Integer;
    NV: Int64;
Begin
  If SrcNumSys <> nsDec Then Begin // Nur aufwendig konvertieren, wenn Anfangssystem nicht Dezimal
    Result := 0;
    ConvStr := LowerCase( SrcNumStr ); // Großbuchstaben zu Kleinbuchstaben wandeln
    Len := Length( ConvStr );
    For i := 0 To Len - 1 Do Begin
      NV := Trunc( IntPower( GetNSSize( SrcNumSys ), i ) ); // passende Potentz ermitteln
      Result := Result + ( GetDecValue( ConvStr[ Len - i ] ) * NV ); // Wert ausrechnen und zum Ergebniss hinzufügen...
    End;
  End Else Begin
    Result := StrToInt64( SrcNumStr );
  End;
End;

Function NumeralSystemConvert( Const SrcNumStr: String; Const SrcNumSys, DestNumSys: TNumeralSystem ): String;
//** Konvertiert eine Zahl eines Systems in ein anderes Zahlensystem
Var ConvStr: String;
    DecConv: Int64;
    DestP: Integer;
Begin
  Result := '';
  ConvStr := LowerCase( SrcNumStr ); // Großbuchstaben zu Kleinbuchstaben wandeln
  If CheckNSString( ConvStr, SrcNumSys ) Then Begin
    If Not ( SrcNumSys = DestNumSys ) Then Begin
      Try
        DecConv := ConvertToDec( ConvStr, SrcNumSys );
        If DestNumSys <> nsDec Then Begin // Wir haben schon ein dezimales Ergebniss, deshalb nur bei nicht dezimalen Zielsystem berechnen...
          DestP := GetNSSize( DestNumSys );
          While DecConv <> 0 Do Begin
            Result := cDisplayDigits[ DecConv Mod DestP ] + Result;
            DecConv := DecConv Div DestP;
          End;
        End Else Begin
          Result := IntToStr( DecConv );
        End;
      Except
        On Error: Exception Do Begin
          Result := 'ERROR: "' + Error.Message + '"';
        End;
      End;
    End Else Begin
      Result := ConvStr; // gleiches Zahlensystem brauch nicht umgewandelt werden...
    End;
  End Else Begin
    Result := 'ERROR: Zeichenfolge konnte wegen ungültiger Zeichen nicht umgerechnet werden.';
  End;
End;
Viel Spass
Christian
  Mit Zitat antworten Zitat