![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
получение шестнадцатиричного значения символа в delphi и наоборот [D7, WinXP]
простак © (2006-06-29 10:34:00)Прежде всего здравствуйте! Не мог бы кто-нибудь помочь мне в моей проблеме: мне нужно сделать следующие преобразования на Delphi -
Пример: '45 00 BC' -> 'E ј' в ANSCI
или '45 00 BC' -> 'E ¼' в ASCII
а как это сделать я соответственно не знаю
Символы иногда представлены вот такими вот закорючками:
╘ z ⌠ Σ ç ╗ æ J 4 \x10 S
В инете нашел функции: BytesToHexStr, HexStrToBytes, HexBytesToChar, только мне не понятно как с ними работать... Может кто чего подскажет мне, новичку? заранее спасибо
простак (2006-06-30 12:53:00) [1]Спасибо я уже разрулил как раз чепез stream...в книжке прочитал
unknown (2006-06-30 00:40:00) [2]
> простак (29.06.06 20:09) [12]
Ну, тогда TFileStream+F1 в руки и вперед.
Loginov Dmitry (2006-06-29 23:15:00) [3]> через что проще всего открыть файл и работать с ним без
> потери информации
Текстовый редактор EditPlus, например. С закарючками работает как следует, без потери информации...
Gydvin (2006-06-29 21:05:00) [4]
> Так я не понял, BinToHex и HexToBin чем-то не устраивают?
Так он сам файл "закорючками" пытается читать в мемо
Vlad (2006-06-29 20:53:00) [5]
> простак (29.06.06 20:09) [12]
Так я не понял, BinToHex и HexToBin чем-то не устраивают?
Gydvin (2006-06-29 20:17:00) [6]Как я уже сказал небудет, это не текст
простак (2006-06-29 20:16:00) [7]Как я понял мемо не будет полностью открывать файл, если в нем встречается нулевой байт.Приведите пример, если не трудно через что проще всего открыть файл и работать с ним без потери информации.
простак (2006-06-29 20:09:00) [8]Цель стоит такая сделать из файла вида А файл вида В и наоборот, где А.bin выглядет примерно так:EјЅАDd°^S п)еҐЖ#жyµG\x1Eы hyЂ{uF?lё6ЖшU±‹љџ»®?ж7oj‘РЮЦ\x14ВДLv‹ьTр`\x193L\x1 ф~\x138¬\x11џ"Qе\x15эЕq›аЕ\x14\x123\x13йч@HPЃ¬5uJy–%ф~ђЂ‡Ѓ…ѓ-‚ Џ€ ^ё“?=й?‡”щ\xEФщ ўћ?ўєpqќEђn-ЄЄґъщщщ Фzф䇻‘J4\x10S
а файл В так - 1651 1 a80 1 b2
0xBC45 0xC0BD 0x6444 0x5EB0 0x2053 0x29EF 0xA5E5 0x23C6 0x79E6 0x47B5 0xFB1E 0x68A0 0x8079 0x757B 0x3F46 0xB86C 0xC636 0x55F8 0x8BB1
....
0x2D6E 0xAAAA 0xFAB4 0xF9F9 0x00F9 0xD400 0xF47A 0x87E4 0x91BB 0x344A
0x5310
Те Ej->0xBC45
Кстати символы здесь немного поменяли свое отображение... ну да ничего суть осталась той же. так вот именно файлы вида А и не загружаются в мемо поэтому как обрабатывать их я не знаю...
Gydvin (2006-06-29 19:42:00) [9]
> простак (29.06.06 19:17) [8]
Повторяеетесь! Хоть вопросы бы на предложенные решения меняли
unknown (2006-06-29 19:32:00) [10]
> простак
Вообще, какая цель стоит?
А то
> почему в Memo ''плохо'' открываются файлы с символами-''закорючками''
как-то очень подозрительно звучит.
unknown (2006-06-29 19:29:00) [11]
> простак (29.06.06 19:17) [8]
> любую пару чисел на 00
Естесственно, #0 - окончание строки.
Надо в таком случае array of byte использовать.
простак (2006-06-29 19:17:00) [12]Спасибо за листинг, это работает почти всегда - но если заменить в вашем примере любую пару чисел на 00 работать не будет - на экран ничего не выводится и никакие мои ухищрения не помогают: скорее всего из-за того что я не знаю причины ошибки. И что вообще обозначает пара 00? в ANCII это выглядит как пробел, но пробел в то же время это 20. PS и вот такой еще вопрос навернулся - почему в Memo ''плохо'' открываются файлы с символами-''закорючками'', то один файл открывается наполовину, а другой выводит самый первый символ. Расширение файлов *.bin, открываю через OpenDialog, используя Memo.Lines.LoadFromFile.
unknown (2006-06-29 12:36:00) [13]
procedure TForm1.Button1Click(Sender: TObject);
var
x: string;
function HexToChars(s: string): string;
var
i: integer;
buf: string;
begin
for i := 1 to Length(s) do
if not (s[i] in ['0'..'9', 'A'..'F', 'a'..'f']) then
begin
if buf > '' then
Result := Result + Chr(StrToInt('$' + buf)) + ' ';
buf := '';
end
else
buf := buf + s[i];
if buf > '' then
Result := Result + Chr(StrToInt('$' + buf)) + ' ';
end;
function CharsToHex(s: string): string;
var
i: integer;
begin
for i := 1 to Length(s) do
if s[i] <> ' ' then
Result := Result + IntToHex(Ord(s[i]), 2)
else
Result := Result + ' ';
end;
begin
x := HexToChars('57 87 99 aa bb cc dd ee ff');
Caption := x + ' = ' + CharsToHex(x);
end;
ЮЮ (2006-06-29 12:31:00) [14]См. Chr и Ord функции
простак (2006-06-29 12:28:00) [15]В принципе char работает... я нашел ошибку перед числом надо поставить знак, определяющий шестнадцатиричное число, и, если написать вот так -
c:=char($B4);
memo2.Lines.Add(c);
то все работает. Остается понять как выполнить обратное преобразование
и по имеющемуся 'c' получить 'B4'. Ни у кого нет идей?
простак (2006-06-29 12:16:00) [16]извините ввел не то имя начинающий = простак
начинающий1 (2006-06-29 12:12:00) [17]мне нужно число в символ... а апострофы я поставил для удобства... но если я пытаюсь например преобразовать 87 в символ у меня получается 'W' а в примере - '‡' или 'З' не понимаю откуда они берутся...
В тотал коммандере через листер открываю файл и выбираю просмотр через режим Hex - слева отображаются шестнадцатиричные числа а справа символы-закорючки, соответствующие этим числам... так вот проблема-то в том что я не найду реализации этого соответствия (из 16-ой -Ю символ и из символа 16-ую). PS функции HexToInt нет в стандартных модулях Delphi7. а что делать потом с бинарным кодо я не представляю...
Jeer (2006-06-29 11:18:00) [18]Разбить строку на пары по пробелу.
Каждую пару преобразовать из hex в int (функциями HexToInt или HexToBin)
Преобразованием типа char() перевести в знак символа.
Слепить итоговую строку.
Desdechado (2006-06-29 11:18:00) [19]так тебе число в символ или "число в строке" в символ?