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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2017, 16:33   #1
ProshkaS
 
Регистрация: 22.08.2015
Сообщений: 4
По умолчанию Преобразовать 16-ричные значения байтов в текст

Пишу программу в Delphi XE8, разбирающую пакет данных, захваченный с помощью Wireshark и сохраненный в текстовый файл.
В файле содержится текст в виде: "d0 b2 d0 b0 d0 b4 d1 8f" или "6d 61 6b 61 72". (в первом случае это "вадя", во втором "makar").
Помогите, пожалуйста, как этот текст декодировать?
ProshkaS вне форума Ответить с цитированием
Старый 18.04.2017, 17:00   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от ProshkaS Посмотреть сообщение
Помогите, пожалуйста, как этот текст декодировать?
если Вы про то, как перевести текстовый файл содержащий строку вида:
d0 b2 d0 b0 d0 b4 d1 8f
в бинарный файл, то всё просто
читаете строку, берёте из строки по два символа,
переводите из строкового Hex представления в числовое (вот так StrToInt('$'+ss))
и полученный байт записываете в выходной файл.
вот и всё.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.04.2017, 17:05   #3
ProshkaS
 
Регистрация: 22.08.2015
Сообщений: 4
По умолчанию

Не совсем. Мне нужно из 'd0 b2 d0 b0 d0 b4 d1 8f' получить 'вадя' и результат занести в поле БД. Причем, русские буквы закодированы 2мя байтами, английские 1им. (utf8, видимо).

utf8decode(#208#178) выдает символ 'в'. 208 - это d0 в dec, 178 - b2 в dec. Но как передать этой функции наши данные, которые находятся в integer переменных, я так и не придумал
ProshkaS вне форума Ответить с цитированием
Старый 18.04.2017, 17:08   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот, набросал рабочий пример:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var s : string;
  f : TFileStream;
  i : integer;
  b : byte;
begin
  f := TFileStream.Create( ExtractFilePath(ParamStr(0))+'RESULT.TXT', fmCreate);
  s := 'd0 b2 d0 b0 d0 b4 d1 8f';

  s := trim(s);
  i :=1;
  while i<Length(s) do begin
    b := StrToInt('$'+copy(s,i,2));
    f.Write(b, 1);
    Inc(i,3);
  end;
  FreeAndNil(f);
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.04.2017, 17:15   #5
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Код:
function HexToStr(const Hex: string): string;
var
  L: Integer;
begin
  L := Length(Hex) div 2;
  SetLength(Result, L);
  HexToBin(@Hex[1], @Result[1], L);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Utf8ToAnsi(HexToStr(StringReplace('d0 b2 d0 b0 d0 b4 d1 8f', ' ', '', [rfReplaceAll]))));
end;
или UTF8Decode вместо Utf8ToAnsi

Последний раз редактировалось Filka; 18.04.2017 в 17:32.
Filka вне форума Ответить с цитированием
Старый 18.04.2017, 17:31   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

опоздал. но всё же свой топорный вариант тоже выложу для коллекции:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var s, sr : AnsiString;
  i : integer;
  ws : widestring;
begin
  s := 'd0 b2 d0 b0 d0 b4 d1 8f';

  i := 1;
  sr := '';
  while i<Length(s) do begin
    sr := sr + AnsiChar(StrToInt('$'+copy(s,i,2)));
    Inc(i,3);
  end;
  ws := utf8decode(sr);

  ShowMessage(ws);
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.04.2017, 17:36   #7
ProshkaS
 
Регистрация: 22.08.2015
Сообщений: 4
По умолчанию

[QUOTE=Filka;1676234]
ошибка при компиляции [dcc32 Error] Unit1.pas(55): E2251 Ambiguous overloaded call to 'HexToBin'
в строке:
Код:
HexToBin(@Hex[1], @Result[1], L);

Последний раз редактировалось ProshkaS; 18.04.2017 в 17:46. Причина: дополнение
ProshkaS вне форума Ответить с цитированием
Старый 18.04.2017, 17:40   #8
ProshkaS
 
Регистрация: 22.08.2015
Сообщений: 4
По умолчанию

[QUOTE=Serge_Bliznykov;1676237]
Благодарю! Все работает. А я 2 дня голову ломал
ProshkaS вне форума Ответить с цитированием
Старый 18.04.2017, 17:42   #9
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

ProshkaS
Код:
function HexToStr(const Hex: AnsiString): AnsiString;
?

Последний раз редактировалось Filka; 18.04.2017 в 17:44.
Filka вне форума Ответить с цитированием
Старый 18.04.2017, 17:48   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от ProshkaS Посмотреть сообщение
Благодарю! Все работает.
Пожалуйста.

Но лучше возьмите код (с) Filka.
Он намного эффективней.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразовать текст lolkaES Помощь студентам 6 10.12.2014 14:11
преобразовать числа в текст Jaroslav Microsoft Office Excel 2 05.06.2014 13:42
Преобразовать в текст - 2 Ogeris Microsoft Office Excel 3 06.03.2012 19:19
Преобразовать в текст Ogeris Microsoft Office Excel 2 02.03.2012 07:15
Преобразовать текст в числовой olimpus Microsoft Office Excel 17 12.11.2008 07:58