Problem z odczytem kodow ascii > 128.

0

Witam
Mam pewien problem z którym nie mogę sobie poradzić. Piszę aplikację która ściąga pliki z serwera FTP postawionym na sterowniku PLC. Dane w pliku są typu real, na 4 bajtach. Funkcja plik.get(nazwa,2) , która czyta poszczególne bajty źle odczytuje kody ascii >128.
Przykładowy plik w którym zapisane są liczby 1,2,3,4,5,6,7,8,9,1 ma postać w ascii ?€ @ @@ @€ @ @Ŕ @ŕ A A. ?€ i w hex 3F 80 20 20 40 20 20 20 40 40 20 20 40 80 20 20 40 A0 20 20 40 C0 20 20 40 E0 20 20 41 20 20 20 41 10 20 20 3F 80 20 20 i liczby 5, 6,7 są źle odczytywane. Dlaczego np liczbę 5 (40 A0 00 00)program odczytuje jako w 64 96 00 00 a nie 64 160 00 00 w dec.
Wiem ,że może to być problem ze stroną kodową ale jakoś nie mogłem sobie z tym poradzić.
Program pisze w Borland Builder c++ 6.0.
Dane czytam kodem poniżej.

char Buf[2];
unsigned char Buf2[100];
        char plikotw[20]="cpu1db62.txt";
         infile.open(plikotw, ios::out | ios::binary);
 int k;
  k=0;
  while(infile.get(Buf,2))
  {

     if((Buf[0]==32)||(Buf[0]==-32))
     {
         Buf2[k]=0x00;
     }else
     {
        Buf2[k]=(int)abs(Buf[0]);    //tutaj gdzieś znajduje się błąd

     }

     Memo1->Lines->Add((AnsiString)Buf);
     //Memo1->Lines->Add((AnsiString)Buf2[k]);
     k=k+1;
  }

    int *ss2[100];
    int u=0;
  Memo1->Lines->Add("Seria danych:");
  int y=0;
  for(int l=0;l<(k/4);l++)                             
  {
    (float *)ss2[l]=&ss[l];

    *ss2[l]=(Buf2[y]<<24) + (Buf2[y+1]<<16) + (Buf2[y+2]<<8) + Buf2[y+3];

    Memo1->Lines->Add((AnsiString)ss[l]);
      y=y+4;
  }

Jeżeli ktoś wie coś na ten temat to bardzo prosiłbym o pomoc , program robię na zaliczenie i jedynie ten problem pozostał. Jak ktoś będzie chciał to oczywiście udostępnię kody programu później.
Pozdrawiam

0

Już sobie poradziłem :).

zmieniłem plik.get() na plik.read() i użyłem unsigned char. Teraz czyta na razie dobrze.
Pozdrawiam.

0

Po co bierzesz wartość bezwzględną ? To powodowało błąd, gdyż get() zwraca kod char czyli -128..127. Wystarczy zwykłe rzutowanie na unsigned char, czyli po prostu wywal abs.

1 użytkowników online, w tym zalogowanych: 0, gości: 1