У меня есть класс для записи в байтах в двоичный файл
class BITWRITER{
public:
ofstream OFD;
char var;
int x;
BITWRITER(char* pot){
OFD.open(pot);
x = 0;
var =0;
}
void WRITE(bool b){
var ^= (-b^var)&(1 << x);
x++;
if(x == 7){
OFD.write(&var, 1);
x = 0;
var = 0;
}
}
}
И мой пример кода:
string bitCode = "0001010";
bool BitIsOne = false;
BITWRITER *write= new BITWRITER("out.bin");
for(int i = bitCode.length()-1 ; i >= 0; i--){
if(bitCode[i] == '1')
BitIsOne=true;
else
BitIsOne=false;
write->WRITE(BitIsOne);
}
delete write;
Что я не понимаю, так это то, почему, когда я запускаю этот точный код, когда я затем в следующий раз читаю этот файл, вместо того, чтобы иметь в двоичном файле только один байт, у меня есть два байта.
В этом примере вывод должен быть
«1010», но перед этим каким-то образом создается один случайный байт («1101»).
Любые идеи были бы хорошы!
двоичный 1010
является 0x0a
который является новой строкой. Вы открываете файл, не указывая, что он должен быть открыт в двоичном режиме.
В Windows, когда вы пишете новую строку в файл текстового режима, он переводит его в последовательность cr / lf. Возврат cr равен 0x0d, который является двоичным 1101
,
Укажите, что файл должен быть открыт в двоичном режиме:
OFD.open(pot, ios::binary);
Других решений пока нет …