1

Тема: AHK: Текст в Base64

Не нашёл способа преобразования текста (переменной с текстом) в Base64 и обратно, без создания файла.
Так понимаю, что нужно как-то"перевести" переменную с текстом в бинарный вид, а при декодировании прочитать как UTF-16?

+ открыть спойлер

Base64ToBin(Base64) {    
    DllCall("Crypt32.dll\CryptStringToBinary" (A_IsUnicode ? "W" : "A"), UInt,&Base64 
        , UInt,StrLen(Base64), UInt,1, UInt,0, UIntP,Bytes, Int,0, Int,0, "CDECL Int") 
    VarSetCapacity(Bin, Req := Bytes * (A_IsUnicode ? 2 : 1)) 
    DllCall("Crypt32.dll\CryptStringToBinary" (A_IsUnicode ? "W" : "A"), UInt,&Base64 
        , UInt,StrLen(Base64), UInt,1, Str,Bin, UIntP,Req, Int,0, Int,0, "CDECL Int")    
    Return Bin
}  
 
BinToBase64(Bin) {   
    DllCall("Crypt32.dll\CryptBinaryToString" (A_IsUnicode ? "W" : "A") 
        , UInt,&Bin, UInt,Size, UInt,1, UInt,0, UIntP,TChars, "CDECL Int") 
    VarSetCapacity(Base64, Req := TChars * (A_IsUnicode ? 2 : 1)) 
    DllCall("Crypt32.dll\CryptBinaryToString" (A_IsUnicode ? "W" : "A") 
        , UInt,&Bin, UInt,Size, UInt,1, Str,Base64, UIntP,Req, "CDECL Int") 
    Return Base64
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2

Re: AHK: Текст в Base64

Пробую закодировать, ничего.


Str = Серый форум
StrPutVar(Str, Bin, "UTF-16")
MsgBox % BinToBase64(Bin)

BinToBase64(Bin) {   
    DllCall("Crypt32.dll\CryptBinaryToString" (A_IsUnicode ? "W" : "A") 
        , UInt,&Bin, UInt,Size, UInt,1, UInt,0, UIntP,TChars, "CDECL Int") 
    VarSetCapacity(Base64, Req := TChars * (A_IsUnicode ? 2 : 1)) 
    DllCall("Crypt32.dll\CryptBinaryToString" (A_IsUnicode ? "W" : "A") 
        , UInt,&Bin, UInt,Size, UInt,1, Str,Base64, UIntP,Req, "CDECL Int") 
    Return Base64
}

StrPutVar(string, ByRef var, encoding)
{
    ; Ensure capacity.
    VarSetCapacity( var, StrPut(string, encoding)
        ; StrPut returns char count, but VarSetCapacity needs bytes.
        * ((encoding="utf-16"||encoding="cp1200") ? 2 : 1) )
    ; Copy or convert the string.
    return StrPut(string, &var, encoding)
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: Текст в Base64

Переменная с текстом и так уже есть в бинарном виде в памяти, ничего переводить не нужно.

string =
(
однажды вычеркнув из жизни
всё то что делал не любя
ты неожиданно встречаешь
себя
)

MsgBox, % StringBASE64 := String2BASE64(string)
MsgBox, % BASE642String(StringBASE64)

String2BASE64(str)
{
   Return CryptBinaryToStringBASE64(&str, StrLen(str) * (A_IsUnicode ? 2 : 1))
}

BASE642String(StringBASE64)
{
   StringBase64ToData(StringBase64, Data)
   Return Data
}
   
CryptBinaryToStringBASE64(pData, Bytes, NOCRLF = "")
{
   static CRYPT_STRING_BASE64 := 1, CRYPT_STRING_NOCRLF := 0x40000000
   Crypt := CRYPT_STRING_BASE64 | (NOCRLF ? CRYPT_STRING_NOCRLF : 0)
   
   DllCall("Crypt32.dll\CryptBinaryToString", Ptr, pData, UInt, Bytes, UInt, Crypt, Ptr, 0, UIntP, Chars)
   VarSetCapacity(OutData, Chars * (A_IsUnicode ? 2 : 1))
   DllCall("Crypt32.dll\CryptBinaryToString", Ptr, pData, UInt, Bytes, UInt, Crypt, Str, OutData, UIntP, Chars)
   Return OutData
}

StringBase64ToData(StringBase64, ByRef OutData)
{
   static CRYPT := CRYPT_STRING_BASE64 := 1
   
   DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64
      , UInt, StrLen(StringBase64), UInt, CRYPT, UInt, 0, UIntP, Bytes, UIntP, 0, UIntP, 0)
   VarSetCapacity(OutData, Bytes) 
   DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64
      , UInt, StrLen(StringBase64), UInt, CRYPT, Str, OutData, UIntP, Bytes, UIntP, 0, UIntP, 0)
   Return Bytes
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4

Re: AHK: Текст в Base64

Только зачем строку кодировать? По объёму больше получается.

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

5

Re: AHK: Текст в Base64

Да возник вопрос, как сохранять в файл куски текста, чтобы его потом можно было легко разобрать, ну а для дилетанта это самый простой путь. Хотя такую же реализацию наблюдал много где, в основном вставляют в XML строки Base64.
Видел как у тебя в недавнем менеджере буфера обмена лихо закручено, но это не для средних умов.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Текст в Base64

serzh82saratov пишет:

как сохранять в файл куски текста

А какая разница, в каком виде сохранять? И тут, и там строка получается. Или это чтобы избежать кириллицы?

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

7 (изменено: serzh82saratov, 2015-04-08 00:11:21)

Re: AHK: Текст в Base64

Кирилица не причём. Ну к примеру надо сохранить в ини файл текст, а в нём есть перенос строки и что то в тексте совпадёт со структурой INI.

Ini = %A_ScriptDir%\INI-File.ini   
Key1 = aaa`nKey2=bbb
Key2 = ccc
IniWrite, %Key2%, %Ini%, Section, Key2
IniWrite, %Key1%, %Ini%, Section, Key1 
IniDelete, %Ini%, Section, Key2
IniRead, Data, %Ini%, Section, Key1
MsgBox % Data
IniRead, Data, %Ini%, Section, Key2
MsgBox % Data

А Ты сам, зачем в менеджере буфера обмена заморачивался?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Текст в Base64

Если речь о переносе строк в ini-файле идёт, тогда понятно. В буфере обмена по тем же причинам ini избегал. Хотя, в принципе, можно просто заменять переносы строк какими-либо редко встречающимися символами, которых наверняка не будет в тексте.

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

9

Re: AHK: Текст в Base64

Кстати, по умолчанию ф-ция CryptBinaryToString сама переносы строк добавляет после определённого количества символов. Без переносов так нужно:

string =
(
однажды вычеркнув из жизни
всё то что делал не любя
ты неожиданно встречаешь
себя
)

MsgBox, % StringBASE64 := String2BASE64(string, 1)
MsgBox, % BASE642String(StringBASE64)

String2BASE64(str, NOCRLF)
{
   Return CryptBinaryToStringBASE64(&str, StrLen(str) * (A_IsUnicode ? 2 : 1), NOCRLF)
}

BASE642String(StringBASE64)
{
   size := StringBase64ToData(StringBase64, Data)
   Return StrGet(&Data, size >> !!A_IsUnicode, A_IsUnicode ? "UTF-16" : "cp0")
}
   
CryptBinaryToStringBASE64(pData, Bytes, NOCRLF = "")
{
   static CRYPT_STRING_BASE64 := 1, CRYPT_STRING_NOCRLF := 0x40000000
   Crypt := CRYPT_STRING_BASE64 | (NOCRLF ? CRYPT_STRING_NOCRLF : 0)
   
   DllCall("Crypt32.dll\CryptBinaryToString", Ptr, pData, UInt, Bytes, UInt, Crypt, Ptr, 0, UIntP, Chars)
   VarSetCapacity(OutData, Chars * (A_IsUnicode ? 2 : 1))
   DllCall("Crypt32.dll\CryptBinaryToString", Ptr, pData, UInt, Bytes, UInt, Crypt, Str, OutData, UIntP, Chars)
   Return OutData
}

StringBase64ToData(StringBase64, ByRef OutData)
{
   static CRYPT := CRYPT_STRING_BASE64 := 1
   
   DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64
      , UInt, StrLen(StringBase64), UInt, CRYPT, UInt, 0, UIntP, Bytes, UIntP, 0, UIntP, 0)
   VarSetCapacity(OutData, Bytes) 
   DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64
      , UInt, StrLen(StringBase64), UInt, CRYPT, Str, OutData, UIntP, Bytes, UIntP, 0, UIntP, 0)
   Return Bytes
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Текст в Base64

заменять переносы строк какими-либо редко встречающимися символами

Так нет гарантий, мало ли что за текст.

Без переносов так нужно:

Я CRYPT_STRING_NOCRLF сразу заметил, спасибо, до этого сам переносы удалял.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11 (изменено: Gh0sTG0, 2022-08-09 23:58:36)

Re: AHK: Текст в Base64

teadrinker
Добрый вечер.
К посту от 2015-04-07 23:15:47.
Напишу тут, мб кто увидит этот некро, хех .
Как его обнулять чтобы использовать больше 1 раза?
Проверил все свои переменные, все пообнулял, остались только твои функции.
Собственно, в чем проблема:
Есть, к примеру, 2 фразы: "папа любит маму" и "сын ест". Закодированны путем скидывания в String2BASE64.
2 объекта для раскодировки, раскодировка происходит в 2 приема.
Loop
{
1 проход: раскодировщик раскодирует и выдает "папа любит маму" -> "папа любит маму".
2 проход: раскодировщик раскодирует и выдает "сын ест" -> "сын естбит маму".
}
То есть, где то, что то не обнулилось. При том очень странно не обнулилось...
Если я добавлю 3ю фразу "Соба", 3 проход выдаст: "Собаестбит маму".
Если я сделаю "Reload" между раскодировками, то оно раскодирует корректно, но мне придется запускать каждый проход вручную, вместо запуска "всех" проходов разом.
Не очень понимаю что там настолько экзотически перезаполняется, но очень хотелось бы узнать где это что то обнулять.
Вроде с кодированием такой проблемы не было, но это не точно.

12

Re: AHK: Текст в Base64

Замените BASE642String() на

BASE642String(StringBASE64)
{
   size := StringBase64ToData(StringBase64, Data)
   Return StrGet(&Data, size >> !!A_IsUnicode, A_IsUnicode ? "UTF-16" : "cp0")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: Текст в Base64

teadrinker
Вроде сработало, спасибо.