Bin to Hex



  • hallo zusammen ich hab in einer char zr[8]; eine binärzahl
    und möchte die in hex umwandel.. wie mach ich das mit BinToHex komm ich nicht klar.. sprich ich weiß ned genau was die funktion von mir erwartet..

    char zr1[8],text[8]
    
    if (cb11->Checked == true)
       {
       zr1[0] = 1;
       }
       else
       {
       zr1[0] = 0;
       }
    
    if (cb12->Checked == true)
       {
       zr1[1] = 1;
       }
       else
       {
       zr1[1] = 0;
       }
    if (cb13->Checked == true)
       {
       zr1[2] = 1;
       }
       else
       {
       zr1[2] = 0;
       }
    if (cb14->Checked == true)
       {
       zr1[3] = 1;
       }
       else
       {
       zr1[3] = 0;
       }
    if (cb15->Checked == true)
       {
       zr1[4] = 1;
       }
       else
       {
       zr1[4] = 0;
       }
    if (cb16->Checked == true)
       {
       zr1[5] = 1;
       }
       else
       {
       zr1[5] = 0;
       }
    if (cb17->Checked == true)
       {
       zr1[6] = 1;
       }
       else
       {
       zr1[6] = 0;
       }
    if (cb18->Checked == true)
       {
       zr1[7] = 1;
       }
       else
       {
       zr1[7] = 0;
       }
    BinToHex(zr1,text,2);
    
    Edit1->Text = text;
    

    mfg

    |23|



  • Hier ein kleines Beispiel zu BinToHex:

    char bin[2];					// Platz für 2 Zeichen
    char text[(sizeof(bin)*2)+1];	// Platz für 2 Hexzeichen + terminierende 0
    
    // 2 Zeichen in Puffer schreiben
    bin[0]='A';
    bin[1]='B';
    // Die 2 Zeichen im Puffer in Hex umwandeln
    BinToHex(bin, text, 2);
    // String Terminierung selber setzen, klappt nicht immer automatisch
    // obwohl das in der Hilfe steht
    *(text+(sizeof(bin)*2))=0;
    
    // Ausgegeben wird der String  '4142'
    ShowMessage(text);
    

    Diese Funktion hat mich allerdings nicht vom Hocker gerissen, das Thema mit der abschließenden Null
    im Zielstring klappte hier nämlich überhaupt nicht. Bei diesem Beipiel stand immer brav eine Hex 01
    am Schluß des Strings.



  • und erklär mir mal bitte wieso 01 bin = 4142 ist ??

    hmm das ganze geht irgendwie nicht.. 😞

    hast auch nen Beispiel wie ich ein Int wer in eine Hexa zahl wandeln kann ??



  • |23| schrieb:

    und erklär mir mal bitte wieso 01 bin = 4142 ist ??

    hmm das ganze geht irgendwie nicht.. 😞

    // 2 Zeichen in Puffer schreiben
    bin[0]='A';
    bin[1]='B';
    

    der ASCII-code für den Buchstaben A ist 41 und für B 42 und das in einem String gibt 4142

    BigNeal



  • BigNeal schrieb:

    <Edit: Zitate bitte auf das Notwendigste beschränken. Danke!>

    Dann erreiche ich damit mein ZZiel auch nicht den ich brauch was,
    was mir aus z.b 10000101 = nen Hexa Zahl macht in diesen Fall ja: 85



  • <Edit: Zitate bitte auf das Notwendigste beschränken. Danke!>
    

    du kannst ja deine checkbox anstatt in ein chararray einfach alle in ein intwert reinschreiben, nicht einzeln in ein char.
    im Stil von:

    int zrl;
    if (cb11->Checked == true)
       {
       zr1 +=1;
       }
       zrl<<1;
    if (cb12->Checked == true)
       {
       zr1 +=1;
       }
       zrl<<1;
    etc..
    ShowMessage(IntToHex(zrl,2));
    


  • Wenn ich mir Dein Programmfragment so ansehe, willst Du eine Binärzahl, dargestellt durch 8 Checkboxen (angekreuzt=1, nicht angekreuzt=0) in eine Hexzahl umwandeln und darstellen. Ich hab Dir mal ein kleines Beispiel gestrickt wie man sowas realisieren könnte. Mach einfach ein neues Projekt (leere Form) mit dem u.a. Code. Alles weiter macht das Programm automatisch.
    Wenn alles funktioniert, versuche den Programmcode nachzuvollziehen und zu verstehen.
    Du kannst natürlich auf die Routinen InitializeObjects / UninitializeObjects verzichten, alle Kompos von Hand auf der Form plazieren und die Tagwerte und die OnClick-Routine der Checkboxen im Objektinspektor einstellen.
    Keine Garantie auf Fehlerfreiheit 😉

    .h Datei

    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    private:	// Anwender-Deklarationen
    	TObjectList *CheckBoxList;
    	TEdit *EHex;
    	TPanel *CheckBoxPanel;
    	unsigned binval1;
    	void __fastcall CheckBoxClick(TObject *Sender);
    	void InitializeObjects(void);
    	void UninitializeObjects(void);
    	void ShowHexVal(TCheckBox *cb, TEdit *ed, unsigned &binval);
    public:		// Anwender-Deklarationen
    	__fastcall TForm1(TComponent* Owner);
    	__fastcall ~TForm1(void);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    .cpp Datei

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
    {
    	InitializeObjects();
    }
    //---------------------------------------------------------------------------
    __fastcall TForm1::~TForm1(void)
    {
    	UninitializeObjects();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::CheckBoxClick(TObject *Sender)
    {
    	ShowHexVal(static_cast<TCheckBox*>(Sender), EHex, binval1);
    }
    //---------------------------------------------------------------------------
    void TForm1::UninitializeObjects(void)
    {
    	CheckBoxList->Clear();
    }
    //---------------------------------------------------------------------------
    void TForm1::InitializeObjects(void)
    {
    	int x, tagwert;
    	TCheckBox *cb;
    
    	// Form initialisieren
    	Position=poDesktopCenter;
    	Width=400;
    	Height=200;
    
    	// "Binärwert" initialisieren, wird von den
    	// Checkboxen entspr. angepasst
    	binval1=0;
    
    	// Panel zur Aufnahme der Eingabekomponenten
    	CheckBoxPanel=new TPanel(this);
    	CheckBoxPanel->Parent=this;
    	CheckBoxPanel->Width=200;
    	CheckBoxPanel->Height=100;
    	CheckBoxPanel->Top=10;
    	CheckBoxPanel->Left=(ClientWidth - CheckBoxPanel->Width) / 2;
    
    	// Checkboxen zum Einstellen der Binärzahl
    	CheckBoxList=new TObjectList(this);
    	tagwert=1;
    	for(x=7; x>=0; x--)
    	{	cb=new TCheckBox(this);
    		cb->Parent=CheckBoxPanel;
    		cb->Top=10;
    		cb->Left=10+(x*23);
    		cb->Width=20;
    		cb->Caption=*NullStr;
    		cb->Tag=tagwert;
    		tagwert<<=1;
    		cb->OnClick=CheckBoxClick;
    		CheckBoxList->Add(cb);
    	}
    
    	// Editfeld zur Anzeige der Hexzahl
    	EHex=new TEdit(this);
    	EHex->Parent=CheckBoxPanel;
    	EHex->Width=40;
    	EHex->Top=50;
    	EHex->Left=(CheckBoxPanel->Width - EHex->Width) / 2;
    	EHex->ReadOnly=true;
    }
    //---------------------------------------------------------------------------
    void TForm1::ShowHexVal(TCheckBox *cb, TEdit *ed, unsigned &binval)
    {
    	if(cb->Checked)
    		binval |= (unsigned)cb->Tag;
    	else
    		binval &= ~(unsigned)cb->Tag;
    
    	ed->Text=IntToHex((int)binval, 2);
    }
    


  • |23|,
    hier noch eine schlichte Alternative (halbherzig getestet):

    char bin[8] = {0,0,0,0,1,0,1,0};
        char dec[8] = {128,64,32,16,8,4,2,1};
    
        int intVal = 0;
        for (int i = 0; i < 8; i++)
        {
            intVal = intVal | (bin[i]*dec[i]);
        }
        String hexStr = IntToHex(intVal, 2);
    


  • ...bin heute Nacht mit einem markerschütternden Schrei erwacht - irgend etwas war überhaupt nicht in Ordnung:
    [cpp] unsigned char dec[8] = {128,64,32,16,8,4,2,1};
    [/cpp]



  • bin heute Nacht mit einem markerschütternden Schrei erwacht ...

    Mir fallen solche Sachen meist dann ein, wenn ich im "gekachelten Raum" Platz genommen habe :D:D:D



  • ich hab die Lösung von dschensky mal noch etwas optimiert:

    char bin[8] = {0,1,0,0,1,0,1,0};
    
        int intVal = 0;
        for (int i = 0; i < 8; i++)
        {
            intVal <<= 1;
            intVal += bin[i];
        }
        String hexStr = IntToHex(intVal, 2);
    

Anmelden zum Antworten