crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Прочитать строки в utf8 из бинарного файла, Ищу решение
iddqd
  опции профиля:
сообщение 17.7.2010, 14:50
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 32
Регистрация: 26.11.2009
Пользователь №: 1261

Спасибо сказали: 1 раз(а)




Репутация:   0  


Есть бинарный файл, в котом местами встречаются строки в кодировке utf8, перед каждой такой строкой стоит её длина в виде qint32.

Вот пример:
06000000D098D0BCD18F

06000000 - длина данных с текстом в байтах,
D098D0BCD18F - слово "Имя" в utf8

Пытаюсь читать вот так:
QDataStream in(&file);
...
qint32 labelLen;
in >> labelLen;
qDebug() << "labelLen=" << labelLen;

uint labelSize=labelLen;
char * label = new char [labelLen];
in.readRawData(label, labelSize);

out << label << "\n";


В консоли вижу нечитаемый набор символов и знаков вопросов вместо текста.

Как правильнее реализовать чтение данных в этом случае?

Qt 4.6, Win32
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 17.7.2010, 15:32
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

Спасибо сказали: 23 раз(а)




Репутация:   0  


для начала попробуй так:
out << QString::fromUtf8(label) << "\n";
out << QString::fromUtf8(label).toLocal8Bit() << "\n";
out << QString::fromUtf8(label).toLatin1() << "\n";
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iddqd
  опции профиля:
сообщение 17.7.2010, 15:41
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 32
Регистрация: 26.11.2009
Пользователь №: 1261

Спасибо сказали: 1 раз(а)




Репутация:   0  


Вот этот вариант
out << QString::fromUtf8(label) << "\n";

даёт в консоли "Имя??????????"

Вроде нормально, только откуда эти знаки вопроса?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 17.7.2010, 15:51
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

Спасибо сказали: 23 раз(а)




Репутация:   0  


подозреваю что ты неправильно считываешь размер строки и соотвественно читаешь данные которые находятся за строкой, а потом их конвертишь в строку :)
сколько у тебя labelLen выдает?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iddqd
  опции профиля:
сообщение 17.7.2010, 15:54
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 32
Регистрация: 26.11.2009
Пользователь №: 1261

Спасибо сказали: 1 раз(а)




Репутация:   0  


labelLen после считывания равен 6. И 6 байт (по 2 байта на одну русскую букву в utf8) - это правильный размер данных с текстом.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iddqd
  опции профиля:
сообщение 17.7.2010, 17:06
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 32
Регистрация: 26.11.2009
Пользователь №: 1261

Спасибо сказали: 1 раз(а)




Репутация:   0  


Разобрался. Надо было явно указать размер данных. Вот так всё работает и выводится правильный текст без знаков вопросов.
out << QString::fromUtf8(label, labelLen) << "\n";


Сообщение отредактировал iddqd - 17.7.2010, 17:07
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.7.2010, 17:30
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


А инициализировать то кто будет?

char * label = new char [labelLen];
memset(label,0,sizeof(*label)*labelLen);//<<<<<<<<

в общем, строка у тебя нулём не оканчивалась. Ещё полезно после заполнения массива (у тебя из in.readRawData) ставить принудительно ноль в конец массива
label[labelLen-1]=0;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iddqd
  опции профиля:
сообщение 17.7.2010, 18:50
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 32
Регистрация: 26.11.2009
Пользователь №: 1261

Спасибо сказали: 1 раз(а)




Репутация:   0  


Строка не оканчивалась нулем, проверил неоднократно.

Ваш вариант тоже работает корректно, спс.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.7.2010, 20:08
Сообщение #9


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(iddqd @ 17.7.2010, 21:50) *
вариант тоже работает корректно

Хм, тогда что же делать с этим
Цитата(iddqd @ 17.7.2010, 21:50) *
Строка не оканчивалась нулем, проверил неоднократно

Когда же появляется не ноль? :) Загадка...

ps Бессмертный ник тому виной, не иначе :D

Сообщение отредактировал Алексей1153 - 17.7.2010, 20:09
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iddqd
  опции профиля:
сообщение 17.7.2010, 20:43
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 32
Регистрация: 26.11.2009
Пользователь №: 1261

Спасибо сказали: 1 раз(а)




Репутация:   0  


Строка нулём не оканчивалась. Вот пример данных:
Цитата
06 00 00 00 D0 98 D0 BC D1 8F 30 00 00 00 D0 90 D0 B2 D1 82 ..


06 00 00 00 - quint32, размер данных с текстом 1й строки
далее 6 байт - текст 1й строки
потом сразу 30 00 00 00 - quint32, размер данных с текстом 2й строки
далее 48 байт - текст 2й строки

Под "тоже" имелось в виду, что при помощи QString::fromUtf8(label, labelLen) я получаю корректную строку аналогично методу предложенному вами. Только без дополнительной инициализации и дописывания 0 в конец массива.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.4.2024, 17:08