2013-07-16 3 views
0
void insert_into_stream(std::ostream& stream, int number) 
{ 
    int length = sizeof(int); 
    char insert_buffer[sizeof(int)]; 
    memcpy(insert_buffer, &number, length); 
    stream.write(insert_buffer, length); 
} 

int int_from_string(std::string string) 
{ 
    int a; 
    std::istringstream(string)>>a; 
    return a; 
} 

Этот код использовался раньше, я не помню, какое небольшое изменение я сделал, и он больше не работает. Когда приходит число (например, 8001), и я отлаживаюсь перед последним оператором, insert_buffer содержит «A», поэтому очевидно, что что-то идет не так, а вторая функция не получает 8001.Где происходит сериализация?

Примечание. Я преобразую поток в строку перед отправкой его во вторую функцию.

Где первая функция неправильная?

--- редактировать ----

Да, я был неправ, первая функция на самом деле делает именно то, что он должен, во-вторых, не так, может кто-нибудь, пожалуйста, исправить это?

+0

'std :: istringstream (string) >> a;' это работает? – andre

+0

да, он использовал, я не могу проверить его прямо сейчас, так как строка anyways имеет ложное значение –

+0

вторая функция, я получил ее от самой SO –

ответ

1

Эти две функции выполняют совершенно разные вещи.

Первая функция записывает необработанное двоичное представление целого числа в поток.

Вы только что скопировали биты, это правильная вещь, если вы сериализуете двоичный файл.

Чтобы преобразовать его обратно, вам нужно будет прочитать в этих 4 байтах и ​​применить его к целому числу, точно так же, как вы делаете наоборот.

Конечно, когда вы исследуете символы, они будут представлять собой однобайтное представление ascii целых битов. Итак, «А» - вполне разумная вещь, чтобы быть там, как и все остальное, поскольку это совершенно бессмысленно.

Вторая функция, однако, выполняет преобразование номера целочисленного числа ASCII. т.е. atoi. Это бессмысленно для того, что вы пытаетесь сделать, поскольку символы не являются номерами ascii, они являются двоичными целыми числами.

Редактировать для редактирования: Вам нужно что-то подобное, просто противоположное тому, что вы делали выше.

int int_from_string(const char* number) 
{ 
    int a; 
    memcpy(&a, number, sizeof(int)); 
    return a; 
} 
+0

спасибо, пожалуйста, отредактируйте –

+0

См. Мое редактирование на мой ответ – Salgar

+0

эй BTW, как я могу связаться с вами, у меня был личный вопрос на C++, связанный с разработкой программного обеспечения в инвестиционных банках –

0

Попробуйте использовать

stream.write((const char*)&number, sizeof(number)); 

Это намного короче, и вы можете также изменить тип числа и он будет работать (для простых типов).

+0

Короче или нет, он не работает лучше его исходного кода. Где люди понимают, что просто сброс битов в файл приведет к тому, что можно прочитать позже. –

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