logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak w Borland C++ zamienić plik binarny na int krok po kroku?

haid 18 Maj 2007 21:55 2150 6
REKLAMA
  • #1 3898732
    haid
    Poziom 13  
    Posty: 129
    Ocena: 2
    Witam męczę się z tym od jakiegoś czasu i ale jakoś mi nie wychodzi
    A więc chcę otworzyć plik bin (bit po bicie) i zamienić na Int napisałem coś takiego
    
    //---------------------------------------------------------------------------
    int BinToInt(String Value)
    {
     int ValueSize, Result;
     Result = 0;
     ValueSize = Value.Length();
    
     for(int i = ValueSize; i > 0; i--)
      if(Value.SubString(i, 1) == "1")
    
     Result = Result + (1 << (ValueSize - i));
     return Result;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    if(OpenDialog1->Execute())
    {
       TFileStream *file = new TFileStream((OpenDialog1->FileName), fmOpenRead);
    int howmany = file->Size / 1;
    unsigned char buf;
    
    for (int i = 0; i < howmany; i++)
    {
            file->Seek(i, soFromBeginning);
            file->Read(&buf, 1);
    
    }
    file->Free();
    
    }
    
    }
    //---------------------------------------------------------------------------
    


    Jak połączyć te fragmenty kodu żeby wykonywało zamianę.
  • REKLAMA
  • #2 3899777
    kloszi
    Poziom 21  
    Posty: 547
    Pomógł: 34
    Ocena: 89
    int howmany = file->Size / 1; ????? po co dzielisz przez 1 ??
    Z pliku można czytać bajt po bajcie a bit po bicie sie nie da. W sumie odczytywanie baj po bajcie to to samo co odczytywanie bit po bicie ( 1 bajt = 8 bit) tylko w paczkach 8 bitowych.

    przyklad:

    unsigned char bit;
    for (int i = 0; i < howmany; i++)
    {
    file->Seek(i, soFromBeginning);
    file->Read(&buf, 1);
    for(int j=0;j<8;j++)
    {
    bit= (buf>>j)&1;
    if(bit==1)
    Memo1->Lines->Add("1");
    else
    Memo1->Lines->Add("0");
    }


    }
  • REKLAMA
  • #3 3905828
    haid
    Poziom 13  
    Posty: 129
    Ocena: 2
    Zastosowałem się do Twojej sugestii no i teraz zaczęło się wyświetlać z tym tylko, że wyświetla się jedna kolumna z pięcioma wartościami i to wszystko. A jak zrobić żeby wyświetliła się cała zawartość pliku. Do podglądu dołączam kod i wygląd oka po uruchomieniu.
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    if(OpenDialog1->Execute())
    {
       TFileStream *file = new TFileStream((OpenDialog1->FileName), fmOpenRead);
    int howmany;
    unsigned char buf;
    
    for (int i = 0; i < howmany; i++)
    {
            file->Seek(i, soFromBeginning);
            file->Read(&buf, 1);
    
     for(int j=0;j<8;j++)
    {
    char bit;
    bit= (buf>>j)&1;
    if(bit==1)
    Memo1->Lines->Add("1");
    else
    Memo1->Lines->Add("0");
    }
    
    }
    file->Free();
    
    }
    
    }
    //---------------------------------------------------------------------------
    


    Jak w Borland C++ zamienić plik binarny na int krok po kroku?
  • REKLAMA
  • #4 3917626
    kloszi
    Poziom 21  
    Posty: 547
    Pomógł: 34
    Ocena: 89
    1) Jest
    int howmany;
    Ma byc
    int howmany=file->Size;


    2) Unieść pionowego Scrolbara

    We właściwościach
    ScrolBars =ssVertical
  • #5 3928011
    haid
    Poziom 13  
    Posty: 129
    Ocena: 2
    Mam jeszcze jedno pytanie co do fragmentu kodu

    for(int j=0;j<8;j++)// co robi ta funkcja znaczy się wiem że j zwiększane jest //o jeden do osiągnięcia 8 w każdym przebiegu pętli ale w jakim celu?
    {
    char bit;// tu definiuje zmienną char
    bit= (buf>>j)&1;// a tu zmiennej bit przypisuje no właśnie co?

    Wiem że to banalne pytania na ale cóż
  • Pomocny post
    #6 3932005
    kloszi
    Poziom 21  
    Posty: 547
    Pomógł: 34
    Ocena: 89
    for - pętla, tak jak napisałeś

    bit= (buf>>j)&1; Operacje bitowe: ">>" przesuniecie w prawo,"&" operacja AND-owania.
    Poczytaj o operatorach w c i będziesz wiedzial
  • REKLAMA
  • #7 3932130
    haid
    Poziom 13  
    Posty: 129
    Ocena: 2
    Oki dziękuje za pomoc :D i poczytam o tym co mówiłeś.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy konwersji zawartości pliku binarnego na typ int w Borland C++. Problemem było odczytanie pliku bit po bicie, co jest niemożliwe bezpośrednio, dlatego zaproponowano odczyt bajt po bajcie (1 bajt = 8 bitów) za pomocą klasy TFileStream. Przykład kodu pokazuje, jak odczytać każdy bajt, a następnie wyodrębnić poszczególne bity przez przesunięcie bitowe i operację AND. Wskazano, że zmienna howmany powinna być ustawiona na rozmiar pliku (file->Size), a nie dzielona przez 1. Omówiono działanie pętli for, która iteruje po bitach bajtu, oraz wyjaśniono operacje bitowe: przesunięcie w prawo (>>) i AND (&). Poruszono także kwestie wyświetlania wyników w Memo1, gdzie problemem było wyświetlanie tylko jednej kolumny, co można poprawić m.in. przez ustawienie właściwości ScrolBars na ssVertical. Całość dotyczy efektywnego odczytu i konwersji danych binarnych na wartości całkowite w środowisku Borland C++ Builder.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA