Czemu dostaje odwróconą wartość binarną?

0

Czesc,

Mam sobie jakiś plik, otwieram go w ios::binary, bo potrzebuje jego wartość binarną.
Ładuje go takim czymś:

std::vector<std::bitset<64>> bytes(
        (std::istreambuf_iterator<char>(input)), // input to otwarty plik
        (std::istreambuf_iterator<char>()));

No i niby spoko, ale pojedyncze chary są ładowane np w ten sposób:
111111111111111111111111111111111111010000

zamiast

00000000000000000000000000000000010000

Jak patrzę w plik za pomocą PEview albo innego edytora to są to zwykłe wartości w Hexie, wcale nie jakieś wielkie. Pytanie moje zatem, skąd to się wzięło i czemu tak jest? W jaki sposób najlepiej załadować plik w postaci binarnej?

2

Na pewno jest to
111111111111111111111111111111111111010000
zamiast
00000000000000000000000000000000010000

a nie
1111111111111111111111111111111111111111111111111111111111010000
zamiast
0000000000000000000000000000000000000000000000000000000011010000?

Masz implementację gdzie char ma znak i promocja ze zmiennej 8-bitowej ze znakiem do 64-bitowej zachowuje znak.

3
std::vector<std::bitset<64>> bytes(
        (std::istreambuf_iterator<char>(input)), // input to otwarty plik
        (std::istreambuf_iterator<char>()));

Ta inicjalizacja daje taki efekt:

  1. ładuj jeden bajt char
  2. ten bajt przekaż do konstruktora std::bitset, gdzie pasujący konstruktor to constexpr bitset( unsigned long long val ) noexcept;
  3. najpierw jednak konwertuj char na unsigned long long, co wykonane zostanie krokiem pośrednim long long (najstarszy bit jest duplikowany).
  4. dodaj do wektora
  5. jeśli nie doszedłeś do końca pliku skok do 1

Czyli jeśli w pliku binarnym będzie jeden bajt 0x80 (dla char jest to wartość -128), to w bytes będzie wartość: 1111111111111111111111111111111111111111111111111111111110000000 (na platformie 64 bitowej).
Krok 3 jest zapewne źródłem twojego bólu głowy.

Teraz pytanie jaki był twój plan? Jak to miało działać, bo nawet rozwiązując problem ze znakiem, to nadal jest to dziwne (niby chcesz mieć wektor bajtów, a wpisałeś tam 64 bity jako element wektora).

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