Re[12]: проблема с символом '\0'
От: dabeat_bf Украина http://alexmogurenko.com
Дата: 09.09.10 13:43
Оценка: 2 (2)
Здравствуйте, irbis3003, Вы писали:

I>
I>BYTE InBlock[409600];
I>    ifstream is("TEST.txt", ios::binary); 
I>    is.read(InBlock, 409600);
I>      is.close();
I>  static ULONG InBlockLen;    //длина входного файла
 
I>  BYTE *iData = InBlock;  //это переменная для выходных данных
I>  InBlockLen = strlen(InBlock)*sizeof(char);
I>  FirstLen = InBlockLen;  //сохраняем длину входных данных    
I>


man srtlen
проблема с символом '\0'
От: Аноним  
Дата: 09.09.10 09:02
Оценка: :)
Суть проблемы:
Есть текстовый файл, в который сохранили набор байт (разные кракозябры типа IПў0g’юрЙ GFЊW›зщDdO?Шy‹ґіХ™˜Їж@¶ґДtFF­ж(–џ=Ѓ9hа").
Через поток пытаюсь загрузить этот файл в переменную :

static BYTE Buffer[1000];

ofstream os("test.txt", ios::binary);  
os.write(Buffer, 1000);
os.close();


И вроде все грузит, но как только система встречает среди байт NUL (т.е. '\0') — она считает это концом файла и дальше считывание не идет.
А таких НУЛ'ов в файле штук сто.

Подскажите, если кто знает, как обойти это, чтоб считывание шло игнорирую байт конца файла.
Re[2]: проблема с символом '\0'
От: Erop Россия  
Дата: 09.09.10 09:31
Оценка: :)
Здравствуйте, Sni4ok, Вы писали:

S>расскажите как вам так удалось с помощью функции write загружать файл в переменную?

Наоборот, всё понятно стало. У него write пишет до 0, а он потом думает, что у него файл не так читается...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: проблема с символом '\0'
От: Антипа Россия  
Дата: 09.09.10 10:08
Оценка: +1
Здравствуйте, irbis3003, Вы писали:

I>В разных файлах \0 встречается в разных местах (может через 10 байт, может через 1500). Эту длину и возвращала функция.


Какая именно функция возвращала эту длину? А то "меня терзают смутные сомненья" ...
Re[10]: проблема с символом '\0'
От: Erop Россия  
Дата: 09.09.10 12:57
Оценка: :)
Здравствуйте, irbis3003, Вы писали:

I>Сейчас попробую подобное. Отпишусь о результатах.

А как ты делал РАнЬШЕ?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[11]: проблема с символом '\0'
От: irbis3003  
Дата: 09.09.10 13:10
Оценка: -1
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, irbis3003, Вы писали:


I>>Сейчас попробую подобное. Отпишусь о результатах.

E>А как ты делал РАнЬШЕ?..

щас расскажу все с начала и до конца, дабы заранее ответить на возможные вопросы:
1. Загружаю файл через поток:

BYTE InBlock[409600];
    ifstream is("TEST.txt", ios::binary); 
    is.read(InBlock, 409600);
      is.close();
  static ULONG InBlockLen;    //длина входного файла
 
  BYTE *iData = InBlock;  //это переменная для выходных данных
  InBlockLen = strlen(InBlock)*sizeof(char);
  FirstLen = InBlockLen;  //сохраняем длину входных данных


2. Передаю полученные данные в функцию шифрования:

C_Encrypt(SessionHandle, InBlock, InBlockLen, iData, &InBlockLen); //функция 100% работоспособна, дело не в ней.


3. Получаем данные из функции и записываем их в файл:

ofstream os("Crypt.txt",  ios::binary);
os.write(iData, FirstLen);//
os.close();


4. Для расшифровки загружаю полученный файл:

BYTE InBlock[409600];
    ifstream is("Crypt.txt", ios::binary); 
    is.read(InBlock, 409600);
      is.close();


Но загружаются байты до первого встречного \0
Re[11]: проблема с символом '\0'
От: irbis3003  
Дата: 10.09.10 00:19
Оценка: :)
Здравствуйте, _niko_, Вы писали:

__>Здравствуйте, irbis3003, Вы писали:


I>>Сделал так же (хотя до этого мой код мало чем от этого отличался), все получилось. Весьма благодарен!


__>dabeat_bf указал же на ошибку в коде (strlen):


__>
__>InBlockLen = strlen(InBlock)*sizeof(char);
__>


Дело не в этом — вместо длины строки в виде переменной я пробовал руками писать ее значение.
Честно говоря, даже сам не совсем понял что именно в коде изменилось, что привело к работоспособности.
Буду разбираться.
Re: проблема с символом '\0'
От: Sni4ok  
Дата: 09.09.10 09:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Через поток пытаюсь загрузить этот файл в переменную :


А>os.write(Buffer, 1000);


А>И вроде все грузит


расскажите как вам так удалось с помощью функции write загружать файл в переменную?
Re[2]: проблема с символом '\0'
От: irbis3003  
Дата: 09.09.10 09:26
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>Через поток пытаюсь загрузить этот файл в переменную :


А>>os.write(Buffer, 1000);


А>>И вроде все грузит


S>расскажите как вам так удалось с помощью функции write загружать файл в переменную?
Re[3]: проблема с символом '\0'
От: irbis3003  
Дата: 09.09.10 09:31
Оценка:
Блин, до чего же неудобно тут, извиняюсь...

В общем торопился, код ни тот взял:


static BYTE InBlock[2048];
 AnsiString iFile;

ifstream is(iFile.c_str(), ios::binary);  
is.read(InBlock, 2048);
is.close();
Re[3]: проблема с символом '\0'
От: irbis3003  
Дата: 09.09.10 09:36
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Sni4ok, Вы писали:


S>>расскажите как вам так удалось с помощью функции write загружать файл в переменную?

E>Наоборот, всё понятно стало. У него write пишет до 0, а он потом думает, что у него файл не так читается...

Запись в файл проходит без проблем. А вот чтение останавливается при встрече первого НУЛ
Re[4]: проблема с символом '\0'
От: Sni4ok  
Дата: 09.09.10 09:38
Оценка:
Здравствуйте, irbis3003, Вы писали:

I>Запись в файл проходит без проблем. А вот чтение останавливается при встрече первого НУЛ


а как вы определили, что останавливается на NULL'е, сколько байт прочитано возвращает?
Re[4]: проблема с символом '\0'
От: blackhearted Украина  
Дата: 09.09.10 09:40
Оценка:
Здравствуйте, irbis3003, Вы писали:

I>Блин, до чего же неудобно тут, извиняюсь...


I>В общем торопился, код ни тот взял:



I>
I>static BYTE InBlock[2048];
I> AnsiString iFile;

I>ifstream is(iFile.c_str(), ios::binary);  
I>is.read(InBlock, 2048);
I>is.close();
I>


Нверно, потому, что AnsiString считает, что 0 — это конец строки.
Предположу , что заполняется оно как-то так:

AnsiString str = InBlock;


А потом выводится :
std::cout << str ;


Попробуйте нормально сконструировать строку.
Re[5]: проблема с символом '\0'
От: irbis3003  
Дата: 09.09.10 09:45
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, irbis3003, Вы писали:


I>>Запись в файл проходит без проблем. А вот чтение останавливается при встрече первого НУЛ


S>а как вы определили, что останавливается на NULL'е, сколько байт прочитано возвращает?


Файл, который прочитывается создается после шифрования, поэтому символы там встречаются псевдослучайно.
Видимо как только на выходе получалось "\0", система принимала это за конец.
А понял что выполнение программы заканчивается именно в этом месте просто, методом научного тыка. Взял несколько файлов одинаковой длины, но разного содержания. (18551 байт). В разных файлах \0 встречается в разных местах (может через 10 байт, может через 1500). Эту длину и возвращала функция.
Re: проблема с символом '\0'
От: Bell Россия  
Дата: 09.09.10 10:08
Оценка:
Здравствуйте, Аноним, Вы писали:

Попробуй вот этот пример:

int main()
{
   char arr1[10] = {1, 2, 3, 4, 0, 6, 7, 8, 9, 10};
   char arr2[10] = {0};

   ofstream os("c:\\test.txt", ios::binary | ios::out);
   os.write(arr1, 10);
   os.close();

   ifstream is("c:\\test.txt", ios::binary | ios::in);
   is.read(arr2, 10);
   copy(arr2, arr2+10, ostream_iterator<int>(cout, "\n"));


   return 0;
}


WinXP, VC7.1 — читает все, что было записано.
Любите книгу — источник знаний (с) М.Горький
Re[7]: проблема с символом '\0'
От: irbis3003  
Дата: 09.09.10 10:14
Оценка:
Здравствуйте, Антипа, Вы писали:

А>Здравствуйте, irbis3003, Вы писали:


I>>В разных файлах \0 встречается в разных местах (может через 10 байт, может через 1500). Эту длину и возвращала функция.


А>Какая именно функция возвращала эту длину? А то "меня терзают смутные сомненья" ...



is.gcount();
Ну а вообще — нетрудно выгрузить полученные байты снова в файл или мемо и посмотреть что считали.
Re[8]: проблема с символом '\0'
От: blackhearted Украина  
Дата: 09.09.10 10:16
Оценка:
Здравствуйте, irbis3003, Вы писали:

I>Здравствуйте, Антипа, Вы писали:


А>>Здравствуйте, irbis3003, Вы писали:


I>>>В разных файлах \0 встречается в разных местах (может через 10 байт, может через 1500). Эту длину и возвращала функция.


А>>Какая именно функция возвращала эту длину? А то "меня терзают смутные сомненья" ...



I>is.gcount();

I>Ну а вообще — нетрудно выгрузить полученные байты снова в файл или мемо и посмотреть что считали.

читали
Автор: blackhearted
Дата: 09.09.10
?
как конструируется строка (AnsiString), из которой потом "выгружаются полученные байты"?
Re[8]: проблема с символом '\0'
От: Антипа Россия  
Дата: 09.09.10 11:39
Оценка:
Здравствуйте, irbis3003, Вы писали:

I>is.gcount();

Точно? У меня есть подозрения, что вы использовали функции для работы с '\0'-завершёнными строками.

I>Ну а вообще — нетрудно выгрузить полученные байты снова в файл или мемо и посмотреть что считали.

Вы это делали? Покажите код.

Я проверил, все работает так, как и должно:

#include <fstream>
#include <iostream>
//#include "stdafx.h"

using namespace std;

int main(int argc, char *argv[])
{
  static unsigned char InBlock[16];

  ifstream is("binary.bin", ios::binary);  
  is.read((char*) InBlock, 16);
  cout << is.gcount() << " bytes read\n";
  is.close();

  for (int i=0; i<16; i++) cout << (int)InBlock[i] << " ";
  cout << "\n";
  return 0;
}


>bin-read.exe binary.bin
16 bytes read
49 50 51 52 53 54 55 56 57 0 97 98 99 100 101 102


Файл binary.bin я сделал руками в 16-ричном редакторе. Там в середине нулевой символ.
Re[9]: проблема с символом '\0'
От: irbis3003  
Дата: 09.09.10 11:40
Оценка:
Здравствуйте, blackhearted, Вы писали:

B>читали
Автор: blackhearted
Дата: 09.09.10
?

B>как конструируется строка (AnsiString), из которой потом "выгружаются полученные байты"?

да, читал.

а выгружаю чтобы посмотреть что загрузил так:

static CK_BYTE buf[2000];
len = sizeof(buf);

ofstream os("iTest.txt", ios::binary);  
os.write(buf, len);
os.close();
Re[9]: проблема с символом '\0'
От: irbis3003  
Дата: 09.09.10 11:52
Оценка:
Здравствуйте, Антипа, Вы писали:

А>Здравствуйте, irbis3003, Вы писали:


I>>is.gcount();

А>Точно? У меня есть подозрения, что вы использовали функции для работы с '\0'-завершёнными строками.

I>>Ну а вообще — нетрудно выгрузить полученные байты снова в файл или мемо и посмотреть что считали.

А>Вы это делали? Покажите код.

А>Я проверил, все работает так, как и должно:


А>
А>#include <fstream>
А>#include <iostream>
А>//#include "stdafx.h"

А>using namespace std;

А>int main(int argc, char *argv[])
А>{
А>  static unsigned char InBlock[16];

А>  ifstream is("binary.bin", ios::binary);  
А>  is.read((char*) InBlock, 16);
А>  cout << is.gcount() << " bytes read\n";
А>  is.close();

А>  for (int i=0; i<16; i++) cout << (int)InBlock[i] << " ";
А>  cout << "\n";
А>  return 0;
А>}
А>


А>
>>bin-read.exe binary.bin
А>16 bytes read
А>49 50 51 52 53 54 55 56 57 0 97 98 99 100 101 102 
А>


А>Файл binary.bin я сделал руками в 16-ричном редакторе. Там в середине нулевой символ.


Сейчас попробую подобное. Отпишусь о результатах.
Re[13]: проблема с символом '\0'
От: Антипа Россия  
Дата: 09.09.10 13:52
Оценка:
Здравствуйте, dabeat_bf, Вы писали:

I>>
I>>BYTE InBlock[409600];
I>>    ifstream is("TEST.txt", ios::binary); 
I>>    is.read(InBlock, 409600);
I>>      is.close();
I>>  static ULONG InBlockLen;    //длина входного файла
 
I>>  BYTE *iData = InBlock;  //это переменная для выходных данных
I>>  InBlockLen = strlen(InBlock)*sizeof(char);
I>>  FirstLen = InBlockLen;  //сохраняем длину входных данных    
I>>


_>man srtlen


Обратите внимание, dabeat_bf, что это он так работает с исходными открытыми данными. Но топикстартер никак не хочет показать кусок кода, в котором он определяет длину считанных зашифрованных данных.
Re[14]: проблема с символом '\0'
От: dabeat_bf Украина http://alexmogurenko.com
Дата: 09.09.10 14:16
Оценка:
Здравствуйте, Антипа, Вы писали:

А>Обратите внимание, dabeat_bf, что это он так работает с исходными открытыми данными. Но топикстартер никак не хочет показать кусок кода, в котором А>он определяет длину считанных зашифрованных данных.


я так понимаю что именно так он и определяет длину... считывает в массив, а потом для массива вызывает strlen... логично что длина будет наблюдатся описанная проблема
Re[9]: проблема с символом '\0'
От: irbis3003  
Дата: 09.09.10 14:35
Оценка:
Здравствуйте, Антипа, Вы писали:

А>Здравствуйте, irbis3003, Вы писали:


I>>is.gcount();

А>Точно? У меня есть подозрения, что вы использовали функции для работы с '\0'-завершёнными строками.

I>>Ну а вообще — нетрудно выгрузить полученные байты снова в файл или мемо и посмотреть что считали.

А>Вы это делали? Покажите код.

А>Я проверил, все работает так, как и должно:


А>
А>#include <fstream>
А>#include <iostream>
А>//#include "stdafx.h"

А>using namespace std;

А>int main(int argc, char *argv[])
А>{
А>  static unsigned char InBlock[16];

А>  ifstream is("binary.bin", ios::binary);  
А>  is.read((char*) InBlock, 16);
А>  cout << is.gcount() << " bytes read\n";
А>  is.close();

А>  for (int i=0; i<16; i++) cout << (int)InBlock[i] << " ";
А>  cout << "\n";
А>  return 0;
А>}
А>


А>
>>bin-read.exe binary.bin
А>16 bytes read
А>49 50 51 52 53 54 55 56 57 0 97 98 99 100 101 102 
А>


А>Файл binary.bin я сделал руками в 16-ричном редакторе. Там в середине нулевой символ.


Сделал так же (хотя до этого мой код мало чем от этого отличался), все получилось. Весьма благодарен!
Re[10]: проблема с символом '\0'
От: _niko_ Россия  
Дата: 09.09.10 19:23
Оценка:
Здравствуйте, irbis3003, Вы писали:

I>Сделал так же (хотя до этого мой код мало чем от этого отличался), все получилось. Весьма благодарен!


dabeat_bf указал же на ошибку в коде (strlen):

InBlockLen = strlen(InBlock)*sizeof(char);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.