1

Тема: AHK: Перевод из hex в текст английский+русский

Добрый день!

Нужно сделать перевод из hex в текст, содержащий английские и русские слова.
Элементарный код дает на выхлопе кракозябры вместо русского, но английский идет нормально.

Пример строки hex-данных, содержащей английский и русский:

HexData =
(
31 00 2d 00 45 00 6e 00 67 00 6c 00 69 00 73 00 68 00 00 00 32 00 2d 00 20 04 43 04 41 04 41 04 3a 04 38 04 39 04 00 00 00 00
)

Loop parse, HexData, % A_Space
	{
	ASCII .= Chr("0x" A_LoopField)
	}
	
MsgBox % ASCII

Есть ли решение этого вопроса?

2

Re: AHK: Перевод из hex в текст английский+русский

Насколько я знаю ASCII это фундамент ANSI, а в ANSI нет поддержки русских символов.

3

Re: AHK: Перевод из hex в текст английский+русский

MandarinKa02 пишет:

в ANSI нет поддержки русских символов.

Чё это нет?

Mambr пишет:

Есть ли решение этого вопроса?

Наверно, закодировать правильно нужно. Код символа получить так можно:

MsgBox, % Asc("Я")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4 (изменено: Mambr, 2016-12-22 02:08:04)

Re: AHK: Перевод из hex в текст английский+русский

teadrinker, кодировал не я, а программа. Я лишь пытаюсь перекодировать ... пока безуспешно.

Чтобы не было лишних вопросов, сделаем так:

HexData := "31 00 2d 00 45 00 6e 00 67 00 6c 00 69 00 73 00 68 20 00 32 00 2d 00 20 04 43 04 41 04 41 04 3a 04 38 04 39 04"

Loop parse, HexData, % A_Space
	{
	Txt .= Chr("0x" A_LoopField)
	}
	
MsgBox % Txt

Скажем, надо перевести все в читабельный текст ...

5

Re: AHK: Перевод из hex в текст английский+русский

Не, ну так совсем плохо.

HexData := "31 00 2d 00 45 00 6e 00 67 00 6c 00 69 00 73 00 68 20 00 32 00 2d 00 20 04 43 04 41 04 41 04 3a 04 38 04 39 04"

MsgBox, % Hex2Text(HexData)

Hex2Text(hex)  {
   Loop parse, hex, % A_Space
   {
      if mod(A_Index, 2)
         num := A_LoopField
      else
         str .= Chr("0x" . A_LoopField . num)
   }
	Return str
}

А вот из предыдущего примера получается:

HexData =
(
31 00 2d 00 45 00 6e 00 67 00 6c 00 69 00 73 00 68 00 00 00 32 00 2d 00 20 04 43 04 41 04 41 04 3a 04 38 04 39 04 00 00 00 00
)

MsgBox, % Hex2Text(HexData)

Hex2Text(hex)  {
   Loop parse, hex, % A_Space
   {
      if mod(A_Index, 2)
         num := A_LoopField
      else
         str .= Chr("0x" . A_LoopField . num)
   }
   Return str
}
teadrinker пишет:

Наверно, закодировать правильно нужно

Оказалось, раскодировать. В каждом символе два байта, это юникод.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Перевод из hex в текст английский+русский

teadrinker, а у меня оба варианта - вообще глухарь.
Сейчас ищу вариант, может задействовать в раскодировании какую-нить стороннюю dll ...

7

Re: AHK: Перевод из hex в текст английский+русский

А как выглядит последний вариант?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Перевод из hex в текст английский+русский

Mambr
Используйте AutoHotkey Unicode.

9

Re: AHK: Перевод из hex в текст английский+русский

HexData := "31 00 2d 00 45 00 6e 00 67 00 6c 00 69 00 73 00 68 00 00 00 32 00 2d 00 20 04 43 04 41 04 41 04 3a 04 38 04 39 04 00 00 00 00"

for k, v in Hex2Text(HexData)
   MsgBox, % v

Hex2Text(hex)  {
   VarSetCapacity(str, StrLen(hex := StrReplace(hex, " "))//2, 0)
   pStrings := [&str]
   
   while RegExMatch(hex, "O)(..)(..)", match, A_Index = 1 ? 1 : match.Pos(0) + 4)  {
      h := "0x" . match[2] . match[1]
      NumPut(h, (addr := &str + (A_Index - 1)*2) + 0)
      (endOfStr && h != 0 && pStrings.Push(addr) && endOfStr := "")
      (h = 0 && endOfStr := 1)
   }
   
   for k, v in pStrings
      pStrings[k] := StrGet(v, "UTF-16")
   Return pStrings
}

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

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder