Russian Qt Forum
Март 28, 2024, 17:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как правильно записать wchar_t в бинарный файл?  (Прочитано 12906 раз)
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« : Март 06, 2018, 00:00 »

Всем доброго времени суток!

Проблема в следующем: есть строка в wchar_t (тип BSTR), в ней находится содержимое png-файла (pngDATA). Пытаюсь сохранить содержимое в файл:
Код:
QFile* pfIco = new QFile( "MyFile.png");
if( !pfIco->open( QIODevice::WriteOnly ) ) {...}
const int iFileSize = SysStringLen( pngDATA );
QDataStream out(pfIco);
out << QString::fromWCharArray(pngDATA, icoFileSize).toUtf8();
pfIco->close();
delete pfIco; pfIco = nullptr;
Содержимое сохраняется не корректно, пробовал писать в QDataStream так:
Код:
QByteArray ba = QByteArray((char*)pngDATA, icoFileSize);
out << ba;
тоже безуспешно.
Подскажите, кто знает, в чем ошибка?  Непонимающий
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 574


Просмотр профиля
« Ответ #1 : Март 06, 2018, 08:47 »

Не ясно, что требуется то? Сохранить png файл или строку в текстовом виде?

Если файл, то QDataStream и не нужен

Код
C++ (Qt)
QFile* pfIco = new QFile( "MyFile.png");
if( !pfIco->open( QIODevice::WriteOnly ) ) {...}
const int iFileSize = SysStringLen( pngDATA );
pfIco->writeData( pngDATA, iFileSize );
pfIco->close();
delete pfIco; pfIco = nullptr;
 
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Март 06, 2018, 10:08 »

Код
C++ (Qt)
const wchar_t *data = ...;
const size_t *dataSize = ...; // in bytes
 
QFile f;
QDataStream out(&f, QIODevice::WriteOnly);
out.writeRawData(reinterpret_cast<const char *>(data), dataSize);
 
Записан

ArchLinux x86_64 / Win10 64 bit
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #3 : Март 06, 2018, 10:16 »

Не ясно, что требуется то? Сохранить png файл или строку в текстовом виде?

Если файл, то QDataStream и не нужен

Код
C++ (Qt)
QFile* pfIco = new QFile( "MyFile.png");
if( !pfIco->open( QIODevice::WriteOnly ) ) {...}
const int iFileSize = SysStringLen( pngDATA );
pfIco->writeData( pngDATA, iFileSize );
pfIco->close();
delete pfIco; pfIco = nullptr;
 

Сохранить необходимо png файл.
При попытке записать BSTR строку:
Код:
pfIco->write( (char*)pngDATA, iFileSize );
данные сохраняются не корректно, png файл не читаем.
Если сохранять так:
Код:
pfIco->write( QString::fromWCharArray(pngDATA, iFileSize).toLocal8Bit(), iFileSize );
то в ряде случаев, некоторые файлы сохраняются не корректно, хотя присутствуют и правильные данные.
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #4 : Март 06, 2018, 10:20 »

Код
C++ (Qt)
const wchar_t *data = ...;
const size_t *dataSize = ...; // in bytes
 
QFile f;
QDataStream out(&f, QIODevice::WriteOnly);
out.writeRawData(reinterpret_cast<const char *>(data), dataSize);
 
Пробовал так. Все данные битые.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Март 06, 2018, 10:27 »

Пробовал так. Все данные битые.
Как вы получаете данные на которые указывает pngDATA?
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #6 : Март 06, 2018, 10:37 »

Данные получаю из COM в виде BSTR строки.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #7 : Март 06, 2018, 10:41 »

Данные получаю из COM в виде BSTR строки.
Как получаете? Покажите код, которые аллоцирует буфер и читает в него из последовательного порта данные.
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #8 : Март 06, 2018, 11:55 »

Я имел в виду не COM-порт, это COM объект.  Крутой
Сам я ничего не аллоцирую, получаю готовую строку из библиотеки.
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #9 : Март 06, 2018, 13:07 »

При сохранении строки в файл, не правильно сохраняется 1 байт: вместо 98 записывается 3F (в HEX).
Сейчас сохраняю так:
Код:
const int iSize = SysStringLen( pngDATA );
pfIco->write( QString::fromWCharArray(pngDATA, iSize).toLocal8Bit(),iSize );
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #10 : Март 06, 2018, 13:50 »

При сохранении строки в файл, не правильно сохраняется 1 байт: вместо 98 записывается 3F (в HEX).

Сначала надо проверить, точно ли в буфере данные, пригодные для сохранения в файл (PNG Specification). Согласно спецификации первые байты должны быть: 89  50  4e  47  0d  0a  1a  0a. Так что нужно ещё проверить Порядок байтов big-endian или little-endian в буфере, и какой порядок нужен для файла. И сохраняйте лучше как ssoft предложил, промежуточные QString, QDataStream и т.п. могут только путаницы добавить. Также следите за правильностью типа и объёма записываемых данных.
Записан

Пока сам не сделаешь...
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #11 : Март 06, 2018, 14:04 »

Приходят правильные данные (тоесть: в BSTR хранится полностью корректный набор данных), но при записи их в файл подменяется значение с: "98", на: "3F".  Грустный
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #12 : Март 06, 2018, 14:17 »

но при записи их в файл подменяется значение с: "98", на: "3F".  Грустный

В файл записывается ровно то, что вы туда отправили, никто ничего не подменяет Улыбающийся.  Скорей всего здесь QString::fromWCharArray(pngDATA, iSize).toLocal8Bit() что-то преобразовывается не так как хотелось бы. Почитайте внимательнее возможные проблемы и рекомендации из моего предыдущего сообщения.
Записан

Пока сам не сделаешь...
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #13 : Март 06, 2018, 15:00 »

Код:
const int iFileSize = SysStringLen( pngDATA );

Я не совсем в теме, но корректно ли длину png файла функцией SysStringLen считать?

Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #14 : Март 06, 2018, 16:18 »

Докопался до того, что в toLocal8Bit() преобразовывается один единственный символ: "0x98" в: "0x63", по какой причине это происходит - выяснить пока не удалось.
По поводу спецификации png и порядка следования байт - все в порядке, заголовок файла правильный.
SysStringLen() - считает длину корректно.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.218 секунд. Запросов: 23.