Что нового

Кодирование Base64

maxd2007

Новичок
Сообщения
89
Репутация
0
Здравствуйте.
Столкнулся с проблемой такого плана, есть программа которая может работать через командную строку, но русский она не понимает, поэтому разработчики исхитрились и сделали при использовании русского языка такую схему, в качестве параметра вбивается путь кодированый в base64 (я так думаю) т.е. путь "C:\1\Тест\200k--l40-04.map" представляется как "QzpcMVzQotC10YHRglwyMDBrLS1sNDAtMDQubWFw" и я могу это использовать так
Код:
ShellExecuteWait ( "Путь к программе", "QzpcMVzQotC10YHRglwyMDBrLS1sNDAtMDQubWFw" & "$$ -jnx")
и это работает, нашел include Base64.au3 подключил его (вложил его во вложении), а он выдает "QzpcMVzS5fHy:rofl:lwMGstLWw0MC0wNC5tYXA=" что явно не соответствует, с английскими буквами все кодируется верно, с русскими коряво =(, есть ли возможность это как то исправить или может есть другой способ?
 

Вложения

  • Base64.au3
    2.9 КБ · Просмотры: 40

sngr

AutoIT Гуру
Сообщения
1,011
Репутация
409
Код:
#include 'encoding.au3'
MsgBox(32,'',_Encoding_Base64Decode('QzpcMVzQotC10YHRglwyMDBrLS1sNDAtMDQubWFw'))
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Текст должен быть в UTF-8.
Код:
#include "Base64.au3"
ConsoleWrite(StringFormat("> %s\n", _Base64Encode(StringToBinary("C:\1\Тест\200k--l40-04.map", 4))))


Код:
ConsoleWrite(StringFormat("> %s\n", _Base64("C:\1\Тест\200k--l40-04.map")))

Func _Base64($s_Source)

   $s_Source = StringToBinary($s_Source, 4)

   $t_BufIn = DllStructCreate("byte["& BinaryLen($s_Source) &"]")
   DllStructSetData($t_BufIn, 1, $s_Source)

   $a_Ret = DllCall("Crypt32.dll", "bool", "CryptBinaryToStringA", _
								   "ptr", DllStructGetPtr($t_BufIn), _
								   "dword", DllStructGetSize($t_BufIn), _
								   "dword", BitOR(0x00000001, 0x40000000), _
								   "ptr", 0, _
								   "dword*", 0)

   $t_BufOut = DllStructCreate("char["& $a_Ret[5]&"]")

   $a_Ret = DllCall("crypt32.dll", "bool", "CryptBinaryToStringA", _
								   "ptr", DllStructGetPtr($t_BufIn), _
								   "dword", DllStructGetSize($t_BufIn), _
								   "dword", BitOR(0x00000001, 0x40000000), _
								   "ptr", DllStructGetPtr($t_BufOut), _
								   "dword*", $a_Ret[5])

   If Not $a_Ret[0] Then
	  Return SetError(1, 0, 0)
   EndIf

   Return SetError(0, 0, DllStructGetData($t_BufOut, 1))
EndFunc ;==>_Base64
 
Автор
M

maxd2007

Новичок
Сообщения
89
Репутация
0
Garrett сказал(а):
Текст должен быть в UTF-8.
Код:
#include "Base64.au3"
ConsoleWrite(StringFormat("> %s\n", _Base64Encode(StringToBinary("C:\1\Тест\200k--l40-04.map", 4))))


Код:
ConsoleWrite(StringFormat("> %s\n", _Base64("C:\1\Тест\200k--l40-04.map")))

Func _Base64($s_Source)

   $s_Source = StringToBinary($s_Source, 4)

   $t_BufIn = DllStructCreate("byte["& BinaryLen($s_Source) &"]")
   DllStructSetData($t_BufIn, 1, $s_Source)

   $a_Ret = DllCall("Crypt32.dll", "bool", "CryptBinaryToStringA", _
								   "ptr", DllStructGetPtr($t_BufIn), _
								   "dword", DllStructGetSize($t_BufIn), _
								   "dword", BitOR(0x00000001, 0x40000000), _
								   "ptr", 0, _
								   "dword*", 0)

   $t_BufOut = DllStructCreate("char["& $a_Ret[5]&"]")

   $a_Ret = DllCall("crypt32.dll", "bool", "CryptBinaryToStringA", _
								   "ptr", DllStructGetPtr($t_BufIn), _
								   "dword", DllStructGetSize($t_BufIn), _
								   "dword", BitOR(0x00000001, 0x40000000), _
								   "ptr", DllStructGetPtr($t_BufOut), _
								   "dword*", $a_Ret[5])

   If Not $a_Ret[0] Then
	  Return SetError(1, 0, 0)
   EndIf

   Return SetError(0, 0, DllStructGetData($t_BufOut, 1))
EndFunc ;==>_Base64
Извиняюсь, что не отвечал 2 дня (не было интернета под рукой), проверил - спасибо действительно работает, а что такое ConsoleWrite? Прочитал справку но как то не уловил суть и зачем Вы ее использовали?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
ma:rofl:2007 [?]
а что такое ConsoleWrite
Записывает данные в стандартный поток вывода STDOUT. Проще говоря, выводит данные в консоль.
Вставьте код в SciTE и нажмите F5, в консоли отобразится результат.
 
Автор
M

maxd2007

Новичок
Сообщения
89
Репутация
0
Garrett сказал(а):
ma:rofl:2007 [?]
а что такое ConsoleWrite
Записывает данные в стандартный поток вывода STDOUT. Проще говоря, выводит данные в консоль.
Вставьте код в SciTE и нажмите F5, в консоли отобразится результат.
Нажимал, этого не произошло. Я примерно так и понял, но т.к. ничего не вывелось задал вопрос.
 
Верх