Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2012, 18:05   #1
AndrzejX
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 55
По умолчанию Unicode и UTF-16

Здравствуйте.
Помогите разобраться с задачей. Описание задачи:

"Задания хранятся в файле виде нуль-терминированных строк в кодировке Unicode (2 байта)
Первое задание ищется по сигнатуре "Task0" (кодировка UTF-16)"

и так далее...

Вопрос. Описание корректно? В смысле, как совместить Unicode и UTF-16.
Если корректно, то как именно выделить из файла первое задание?

Прошу заранее простить, если что неясно, так как это неясно мне самому.
AndrzejX вне форума Ответить с цитированием
Старый 22.06.2012, 18:24   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Думаю, для Вашей задачи можно считать, что Unicode и UTF-16 - это одно и то же.
s-andriano вне форума Ответить с цитированием
Старый 22.06.2012, 18:39   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

UTF==Unicode Transformation Format
то есть любой UTF уже юникод.

а учитывая что у вас винда, то там широкие строки итак в UTF8, любая ДЕлфи начиная с 2009(может и ниже, не помню) и так работает с юникодом.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.06.2012, 18:40   #4
AndrzejX
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 55
По умолчанию

Спасибо за ваши ответы.
Текст из файла я прочитал:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  f    : File;
  WStrBuff : WideString;
  CountWideChar : Integer;
  StrRes  : String;
begin
  AssignFile(f, ExtractFilePath(Application.ExeName)+'\scaner.exe');
  Reset(f, SizeOf(WideChar));
  CountWideChar := FileSize(f);
  SetLength(WStrBuff, CountWideChar);
  BlockRead(f, PWideChar(WStrBuff)^, CountWideChar);
  StrRes := WideCharLenToString(PWideChar(WStrBuff), CountWideChar);
  Finalize(WStrBuff);
  CloseFile(f);
end;
но в переменной StrRes нет такой строки как "Task0".
Поэтому и возник вопрос. Задача получена через вторые руки, поэтому непонятно, корректно ли описание. Или я что-то не так сделал.
Кстати, у меня Delphi-7.

Последний раз редактировалось AndrzejX; 22.06.2012 в 18:43.
AndrzejX вне форума Ответить с цитированием
Старый 23.06.2012, 00:01   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Текст из файла я прочитал:

\scaner.exe
оригинальный способ хранения текста )

Код:
SetLength(WStrBuff, CountWideChar div SizeOf(WideChar));

StrRes := WideCharLenToString(PWideChar(WStrBuff), CountWideChar div SizeOf(WideChar));
и вобще, зачем эта StrRes нужна, работайте с WStrBuff спокойно, это обычная строка.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 23.06.2012, 19:00   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

veniside, обратите внимание на оператор resеt.
CountWideChar уже выражен в длинах WideChar.
Вот если бы было reser(..., 1); тогда бы Ваше замечание имело смысл.

Цитата:
но в переменной StrRes нет такой строки как "Task0".
Ну, нет - значит, нет. В чем проблема то?

Тем более, что veniside намекнул Вам, что в файле с расширением exe, в общем-то, и нет никаких оснований быть подобной строке. А если она там даже есть, совершенно неочевидно, что ее можно обнаружить приведенным способом.

Последний раз редактировалось s-andriano; 23.06.2012 в 19:06.
s-andriano вне форума Ответить с цитированием
Старый 24.06.2012, 01:17   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
veniside, обратите внимание на оператор resеt.
а, точно, последний раз пользовался такими раритетными функциями в досе. тогда да, div не нужен.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 24.06.2012, 09:28   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...господа форумчане: нас пытаются нае....ть, мягко говоря. Поясню: либо текущий TC - AndrzejX есть клон товарища Глеб1991 из темы фриланса "передача данных" http://programmersforum.ru/showthread.php?t=205886, либо этот TC нашими руками денег себе зарабатывает ...либо его также нае....т.

Аргументы и факты

1-
Цитата:
Сообщение от AndrzejX
Здравствуйте.
Помогите разобраться с задачей. Описание задачи:

"Задания хранятся в файле виде нуль-терминированных строк в кодировке Unicode (2 байта)
Первое задание ищется по сигнатуре "Task0" (кодировка UTF-16)"

и так далее...
Цитата:
Сообщение от =AndrzejX
но в переменной StrRes нет такой строки как "Task0".
Поэтому и возник вопрос. Задача получена через вторые руки
2- вот письма из переписки, полученные от товарища Глеба с той темы:
Цитата:
передача данных
Когда: 22 июн. в 19:07
Кому: gleb.lucenko@mail.ru
От кого: radio money123 radio.money@yandex.ru

"Нужна ваша помощь, мне надо опр. строки из дельфи записать в файл по опр правилу. Разумеется я готов заплатить за работу, кому интересно пишите на почту gleb.lucenko@mail.ru"
- поясните подробнее?

C уважением.
Цитата:
Глеб Луценко gleb.lucenko@mail.ru
Описание формата задания для поиска.doc 31 КБ
Скачать
Просмотреть
задание непростое, как кажется на первый взгляд, но быстрое.

Я глава одного НИРа и мне нужно было написать программу для спец. целей. Она написана на ассемблере, но сами понимаете - пользователи не любят такой вид( не товарный) поэтому доп. была сделана программа на дельфи(пользовательская часть), но вот беда. Передавать информацию из дельфи пришлось через спец. файл настроек и вот с ним у меня проблема.

Т.е. есть файл .ехе и в опр. метки нужно производить запись из моей программы - записей всего 5. Мало, но я по другой части специалист, а не дельфист, поэтому к вам обращаюсь. Я вам скину саму инструкцию по записи - посмотрите.

О цене скажем если вы сделаете за завтра, то я вам перекину сумму в 700р - лучше на сот. номер так как я в деревни сейчас и это единственный способ, и то придется 2км протопать до цивилизации. Разумеется вы можете и свою цену назвать.

сможете осилить такое задание?
Цитата:
передача данных
Когда: 23 июн. в 01:13
Кому: radio money123 radio.money@yandex.ru
От кого: Глеб Луценко gleb.lucenko@mail.ru
не за 700 хм а за сколько?



Sat, 23 Jun 2012 00:12:51 +0300 от radio money123 <radio.money@yandex.ru>:
...уже делал нечто похожее, парсер для DXE файлов ELF-формата для их конвертации.

Справлюсь, но не "за завтра". Дня два-три, может быстрее. И не за 700 рублей

p.s.: положение TASK0 произвольное ?
Цитата:
передача данных
Когда: 23 июн. в 01:17
Кому: radio money123 radio.money@yandex.ru
От кого: Глеб Луценко gleb.lucenko@mail.ru

да и сроки большие. Давайте лучше вы приостановите работу, я еще завтра подожду может, кто оперативнее сделает за 700р, если не найду то вам отпишу, а может и сам сделаю.

думаю так будет правильнее.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 24.06.2012, 09:28   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...не влезло.

3- присланное описание задание:
Цитата:
Описание формата задания для поиска.
Задания хранятся в виде нуль-терминированных строк в кодировке Unicode (2 байта)
На данный момент реализовано 5 критериев для поиска:
Имя файла (маска) - поиск чувствителен к регистру в формате виндос
Временной интервал по времени создания
Временной интервал по времени последнего доступа
Временной интервал по времени последнего изменения
Интервал по размеру файла

Первое задание ищется по сигнатуре "Task0" (кодировка UTF-16)
По смещению 16 байт от сигнатуры лежит маска имени файла. Длина маски 39 символов, один символ терминирующий, т.е. общая длина строки 80 байт.
По смещению 96 байт от сигнатуры лежит строка с левой границей даты создания файла в виде "дд.мм.гггг". Для игнорирования левой границы используется заведомо ранняя дата 01.01.1601.
По смещению 120 байт от сигнатуры лежит строка с правой границей даты создания файла в виде "дд.мм.гггг". Для игнорирования правой границы используется заведомо поздняя дата 31.12.3082.
....
....

Аналогично по сигнатурам "Task1" ... "Task7" находятся остальные 7 заданий.
p.s.: я конечно претензий к тому ТС не имею, ибо предоплату еще не взял (хотя уже читаю и записываю на место все сигнатуры ), да и сумма копеешная за такую работу. Но что-то тут не чисто и кто-то темнит...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 24.06.2012 в 09:36.
raxp вне форума Ответить с цитированием
Старый 24.06.2012, 09:43   #10
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
...такими раритетными функциями...
Ну, что делать - совместимость с ОС CP/M-80. В ней длина файла задавалась не в байтах, как в более поздней MS DOS, а в секторах. А сектора тогда были маленькими (8-дюймовые дискеты одинарной плотности) - 128 байт. Отсюда берет свое начало и столь "странная" для DOS длина по умолчанию.

AndrzejX, по поводу Вашей задачи.
Вы не удосужились написать, что именно Вам нужно, поэтому приходится догадываться.
Если предположить, что у Вас есть *.exe файл, и Вам нужно на1йти в нем строку, которая, достоверно известно, закодирована в Юникоде, то Вы делаете несколько ошибок.
Чтобы решить такую задачу, следует учесть, что:
1. Далеко не усе двухбайтовые комбинации являются символами UTF-16. Следовательно, при обработке произвольной последовательности функция преобразования попросту может "заткнуться" на недопустимом коде.
2. UTF-16 содержит не только 2-байтовые символы, но и 4-байтовые. Следовательно, при разборе произвольной последовательности может быть пропущена часть 2-байтовых комбинаций.
3. Даже при благоприятном стечении обстоятельств пол п.п. 1-2 чтобы найти последовательность тем методом, которым Вы пытаетесь, смещение юникодной строки в файле должно быть четным.

Поэтому, если Вам нужно найти юникодную строке в произвольном бинарном файле, то действовать нужно следующим образом:
1. Файл читается как байтовый.
2. Юникодная строка рассматривается как последовательность байтов. Например, "Task0" будет занимать 12 байтов (вместе с завершающим 0). Вот эту байтовую последовательность и нужно искать в файле.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразовние Utf-16 <=> Utf-8 hard-t Общие вопросы C/C++ 1 26.08.2011 13:54
UTF 16 Federal Помощь студентам 5 29.12.2010 00:30
Ansi в UTF-8 и наоборот UTF-8 в Ansi Alar Работа с сетью в Delphi 3 09.12.2010 17:02
from utf-8 to unicode artush1984 Общие вопросы C/C++ 7 04.09.2009 19:44