2017-02-01 2 views
0

У меня есть длинная длинная переменная без знака, которую я хочу записать в двоичный файл. Однако мне нужно пренебречь всеми ведущими байтами, которые равны нулю.
Это означает, чтоПреобразовать unsigned long в char *, игнорировать высокие 0 байт

unsigned long long toWrite = 4; 

должен написать 0x04 и 0x00 не 0x00 0x00 0x00 0x00 0x00 0x00 0x04 к потоку.

#include <fstream> 
int main(){ 
    std::ofstream out("test.txt", std::ios::binary); 
    unsigned long long toWrite = 4; 
    out << cutoffZeroBytes(toWrite); 
    out.close(); 
    return 1; 
} 

Я думал о том, чтобы cutoffZeroBytes функцию, которая возвращает char*. Но если в середине есть нулевые байты (например, 0x03 0x00 0xf1), то я думаю, что я не мог записать его в поток, так как 0x00 определяет конец массива char. Я немного незнакомый здесь и нуждаюсь в некоторой помощи.

+0

вы можете вернуть символ * и длину. Обработка символа char *, как строки, является лишь соглашением, а не требованием. Это так же справедливо, если рассматривать его как указатель на массив символов. Вы не могли использовать оператор <<. ostream :: write должен работать нормально. – xaxxon

+0

также, какой выход вы ожидаете, если значение на самом деле 0? – xaxxon

+0

сделать минимум до одного байта и решить проблему 0 – J3STER

ответ

1

Один способ использования для этой цели. Так, просто изменить:

out << cutoffZeroBytes(toWrite); 

к:

out.write((char*)&toWrite, sizeof(toWrite)); 

И если вы хотите, чтобы сократить этот номер:

char* start = (char*)&toWrite; 
int pi = sizeof(toWrite); 
for (; pi > 0; pi--, start++) 
    if (*start) 
     break; 
out.write(start, pi); 
+0

как бы это отрезало лидирующие 0? – xaxxon

+0

Я думаю, что это не меняет сути того, что я пытаюсь проиллюстрировать. Я не делаю домашнее задание, я даю направление. :) Я думаю, что вы могли бы адаптировать его разумно, начиная с этого момента. –

+1

Более переносимый метод (и не полагается на Endianness) состоит в том, чтобы выделить младший значащий байт: 'uint8_t byte = (uint8_t) (toWrite & 0xFFU); out.write (& byte, 1); ' –

Смежные вопросы