Что нового

Неправильная автозамена символов через StringReplace

Diesel

Новичок
Сообщения
35
Репутация
0
Версия AutoIt: 3.3.8.0

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#NoTrayIcon

Global $aOldHex[54] = [53,'41','42','43','44','45','46','47','48','49','4A','4B','4C','4D','4E','4F','50','51','52','53','54','55','56','57','58','59','5A','20','61','62','63','64','65','66','67','68','69','6A','6B','6C','6D','6E','6F','70','71','72','73','74','75','76','77','78','79','7A']
Global $aNewHex[54] = [53,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']

GUICreate("Test", 580, 110)
$Input = GUICtrlCreateEdit("",10,10,560,62)
$Button5 = GUICtrlCreateButton("Hex > Txt", 500, 73, 55, 18)
$Button6 = GUICtrlCreateButton("Txt > Hex", 500, 91, 55, 18)

GUISetState()
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
         Case $GUI_EVENT_CLOSE
            Exit
         Case $Button5
			$sText = ClipGet()
			For $i = 1 To $aOldHex[0]
			   $sText = StringReplace($sText, $aOldHex[$i], $aNewHex[$i], 0, 2)
			Next
			GUICtrlSetData($Input, $sText)
			ClipPut($sText)
		 Case $Button6
			$sText = GUICtrlRead($Input)
			For $i = 1 To $aNewHex[0]
			   $sText = StringReplace($sText, $aNewHex[$i], $aOldHex[$i], 0, 2)
			Next
			GUICtrlSetData($Input, $sText)
			ClipPut($sText)
    EndSwitch
WEnd


Кнопка "Txt > Hex" должна изменить предложение:
I have been waiting for you.
На:
492068617665206265656E2077616974696E6720666F7220796F75.
А обратно получается криво:
I ha7fR0b6VVE wai7F9ng for you.

Выручайте:smile:
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Возможно так будет проще
Код:
#include <String.au3>
$Text = "I have been waiting for you"
$TextToHex = _StringToHex($Text)
MsgBox(0, "Hex", $TextToHex)
$HexToText = _HexToString($TextToHex)
MsgBox(0, "Text", $HexToText)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Diesel,
Можно так попробовать сделать.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#NoTrayIcon

GUICreate('Test', 580, 110)
$nInput = GUICtrlCreateEdit('AutoIt v3 - бесплатный скриптовый язык.', 10, 10, 560, 62)
$nButton5 = GUICtrlCreateButton('Txt > Hex', 500, 73, 55, 18)
$nButton6 = GUICtrlCreateButton('Hex > Txt', 500, 91, 55, 18)
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetState()
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButton5
			$sText = GUICtrlRead($nInput)
			$sNewText = ''
			For $i = 1 To StringLen($sText)
				$sNewText &= Hex(Asc(StringMid($sText, $i, 1)), 2)
			Next
			$sText = ''
			GUICtrlSetData($nInput, $sNewText)
			GUICtrlSetState($nButton5, $GUI_DISABLE)
			GUICtrlSetState($nButton6, $GUI_ENABLE)
			$sNewText = ''
		Case $nButton6
			$sText = GUICtrlRead($nInput)
			$sNewText = ''
			For $i = 1 To StringLen($sText) Step 2
				$sNewText &= Chr(Dec(StringMid($sText, $i, 2)))
			Next
			$sText = ''
			GUICtrlSetData($nInput, $sNewText)
			GUICtrlSetState($nButton6, $GUI_DISABLE)
			GUICtrlSetState($nButton5, $GUI_ENABLE)
			$sNewText = ''
	EndSwitch
WEnd
 
Автор
D

Diesel

Новичок
Сообщения
35
Репутация
0
После hex символа "00" скрипт напрочь отказывается преобразовывать hex дальше.
Пример:
Hex: 6F6E207468652076696C6C6167652E005E5B43616C6D6F6E5D
Должно быть:
А мне выводит:

Код:
#include <String.au3>
$sText = "6F6E207468652076696C6C6167652E005E5B43616C6D6F6E5D"
$HexToText = _HexToString($sText)
MsgBox(0, "Text", $HexToText)


Мой скрипт в первом сообщении выводит сообщение полностью, но заменяет не все символы...
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Diesel [?]
заменяет не все символы
Заменяет-то он все символы. Просто в вашем алгоритме не анализируются пары. Поэтому в строке 6861766520 у вас заменяется 52 (т.к. раньше), а должно 65 и 20 (но позже).
Или "слипаются" символы: TB = 5442 -> 54B -> 5K
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Diesel
Странно, однако
Так правильно все выводит, и нулей нет
Код:
#include <String.au3>
$Text = "on the village. ^[Calmon]"
$TextToHex = _StringToHex($Text)
MsgBox(0, "Hex", $TextToHex)
$HexToText = _HexToString($TextToHex)
MsgBox(0, "Text", $HexToText)
 
Автор
D

Diesel

Новичок
Сообщения
35
Репутация
0
InnI, не подскажешь как анализировать пары?

AZJIO пожалуйста, не MsgBox.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <String.au3>
#NoTrayIcon

GUICreate("Test", 580, 110)
$Input = GUICtrlCreateEdit("",10,10,560,62)
$Button5 = GUICtrlCreateButton("Hex > Txt", 500, 73, 55, 18)

GUISetState()
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
         Case $GUI_EVENT_CLOSE
            Exit
         Case $Button5
            $sText = GUICtrlRead($Input)
			$HexToText = _HexToString($sText)
			GUICtrlSetData($Input, $HexToText)
    EndSwitch
WEnd


Yuriy работает отлично. А если мы изначально не знаем что текст "on the village. ^[Calmon]" ?
У нас есть только "6F6E207468652076696C6C6167652E005E5B43616C6D6F6E5D"
Код:
#include <String.au3>
$Text = "6F6E207468652076696C6C6167652E005E5B43616C6D6F6E5D"
$HexToText = _HexToString($Text)
MsgBox(0, "Text", $HexToText)
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Diesel [?]
пожалуйста, не MsgBox.
Я не удивляюсь. Направте данные в файл и посмотрите его Hex редактором. То что GUI элементы не отображают это меня не удивляет.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Diesel
Можно еще так
Код:
#include <String.au3>
$Text = "6F600E2070046865200076696C600C6167652E005E5B0043616C6D6F6E5D"
$Text2 = StringReplace($Text, "00", "")
$HexToText = _HexToString($Text2)
MsgBox(0, "Text", $HexToText)
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
00 на особом счету, он и в регулярных выражениях может иметь проблемы, и при сравнении воспринимается как False, а не как обычный текст который True.
Можешь поправить приме в первом сообщении, чтобы форум не растягивался? Перенос строки в коде "_".
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Diesel [?]
как анализировать пары?
Вероятно так же, как это делает
Код:
BinaryToString()
Или вы действительно хотите собственную функцию написать?


Добавлено:
Сообщение автоматически объединено:

А мне захотелось :smile: И вот что получилось
Код:
Case $Button5
            Dim $aText[1]
            $sText = ClipGet()
            ; проверка на чётность
            If Mod(StringLen($sText), 2) <> 0 Then  $sText &= " "
            ; создание массива
            ReDim $aText[StringLen($sText) / 2 + 1]
            $aText[0] = StringLen($sText) / 2
            ; разбиение по парам
            For $i = 1 To StringLen($sText) Step 2
              $aText[$i / 2 + 0.5] = StringMid($sText, $i, 2)
            Next
            ; преобразование массива
            For $i = 1 To $aText[0]
              ; замена пустых пар
              If $aText[$i] = "00" Then
                $aText[$i] = " "
                ContinueLoop
              Else
                ; замена известных пар на соответствующие символы
                For $j = 1 To $aOldHex[0]
                  If $aText[$i] == $aOldHex[$j] Then
                    $aText[$i] = $aNewHex[$j]
                    ExitLoop
                  EndIf
                Next
                ; замена неизвестных пар
                If $j = $aOldHex[0] + 1 Then $aText[$i] = "?"
              EndIf
            Next
            ; преобразование массива в строку
            $sText = ""
            For $i = 1 To $aText[0]
               $sText &= $aText[$i]
            Next
            ; вывод строки
            GUICtrlSetData($Input, $sText)
            ClipPut($sText)
 
Верх