Base64PNG_to_HICON() : Uses native PNG Decompression (requires WIN VISTA and later)

Post your working scripts, libraries and tools for AHK v1.1 and older
User avatar
SKAN
Posts: 1551
Joined: 29 Sep 2013, 16:58

Base64PNG_to_HICON() : Uses native PNG Decompression (requires WIN VISTA and later)

03 Sep 2017, 14:06

New version (added 04-June-2023) : Base64PNG_to_HICON() for AHK v2

Base64PNG_to_HICON( Base64PNG [, Width, Height] )

Code: Select all

Base64PNG_to_HICON(Base64PNG, W:=0, H:=0) {     ;   By SKAN on D094/D357 @ tiny.cc/t-36636
Local BLen:=StrLen(Base64PNG), Bin:=0,     nBytes:=Floor(StrLen(RTrim(Base64PNG,"="))*3/4)                     
  Return DllCall("Crypt32.dll\CryptStringToBinary", "Str",Base64PNG, "UInt",BLen, "UInt",1
            ,"Ptr",&(Bin:=VarSetCapacity(Bin,nBytes)), "UIntP",nBytes, "UInt",0, "UInt",0)
       ? DllCall("CreateIconFromResourceEx", "Ptr",&Bin, "UInt",nBytes, "Int",True, "UInt"
                 ,0x30000, "Int",W, "Int",H, "UInt",0, "UPtr") : 0            
}



Demo script

Code: Select all

#NoEnv
#SingleInstance, Force

Base64PNG := "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAAAflBMVEXOgwD///+AUQDz5NSTXQD"
. "j3NSliWe7dwCnagDGtaPnx6Pbp2eGVQDt1rz6+PXRjSTJgADCewCycQCeZADkwJbhuIf58ur06t/qzrDesHirb"
. "QDw3ci0nILYn1TVlj+KYSSiZwCYYQCOWgDVyby+q5acfFSTbz/u4dTc08jNv7D3Mcn0AAACq0lEQVR42uzaXW/"
. "aMBSA4WMn4JAQyAff0A5o123//w/OkSallUblSDm4qO9759zYfo4vI0RERERERERERERERERERERERB97Kva5L"
. "3lX6deroljKXVoWxcpvWCbv2vkP++JJdFvud8nCfFZSrlQP8bwqE/NZiyTfa82hOJqgNrkotd6YoI6FKFSa4LY"
. "qM1huTXCljN7aGIX9dSbgW8vYJWZIopAZUgIAAADEBHCuigvwy9VRAawvbQ91NICJP8A8zZoqIkDXPIsG8K+Li"
. "wngu1ZRAXxtXADbxgawTVwAGx0gBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
. "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgI8BDBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
. "AAAAAD6AFOFHgrAKgQAAAAAAAAAADwegBuphwX4ln+KAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
. "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA1AY5mQAsNgIUZ0O/RAQozoJkGQ"
. "G4GNB0dQNbhE/hjNQBkF/4CT3Z8AFmutkGbv/y0OgDyvNuYgLavP6wGQGdQ5GVy+xCTyezU3V4LoDNY50lyG3/"
. "yMpt2t1cB6EunvtOsr1u/2RuJQm9T36zv1S/7m+sD2CGJQva/AQDAnQAudkBzUWhuB3SRsXN2QJkolNkBORm9J"
. "nwCZ1HpHP4CG1GoOlyDNm9rUao+Bw3heqhEqcplbXr7EGmaNbWoVjdZmt7GT9vMVaKf8zVZn/PVcsdq58v6Ds5"
. "XCRERERER/W0PDgkAAAAABP1/bfQEAAAAAAAL2VmKC7LwdTIAAAAASUVORK5CYII="

Gui, Add, Picture,, % "HICON:" Base64PNG_to_HICON(Base64PNG)
Gui, Show,, Base64PNG_to_HICON() DEMO 
Return 

; Copy and paste Base64PNG_to_HICON() below
Image used in above demo is attached below:
Attachments
H256x256.png
H256x256.png (878 Bytes) Viewed 7806 times
My Scripts and Functions: V1  V2
Helgef
Posts: 4709
Joined: 17 Jul 2016, 01:02
Contact:

Re: Base64 to HICON : Native PNG Decompression (requires WIN VISTA and later)

03 Sep 2017, 14:57

Nice! Thanks for sharing.
Cheers.
Spoiler
User avatar
SKAN
Posts: 1551
Joined: 29 Sep 2013, 16:58

Re: Base64 to HICON : Native PNG Decompression (requires WIN VISTA and later)

04 Sep 2017, 07:32

Helgef wrote:Nice! Thanks for sharing.
Thanks! .. and thanks for the snippet! :)
My Scripts and Functions: V1  V2
User avatar
SKAN
Posts: 1551
Joined: 29 Sep 2013, 16:58

Include script icon in script.

04 Sep 2017, 07:33

Re-posting example script from ask for help topic:

Code: Select all

; Ask for help topic: https://autohotkey.com/boards/viewtopic.php?t=36640

#NoEnv
#SingleInstance, Force
#NoTrayIcon
Menu, Tray, UseErrorLevel
hICON := Base64toHICON()               ; Create a HICON
Menu, Tray, Icon, HICON:*%hICON%       ; AHK makes a copy of HICON when * is used
Menu, Tray, Icon
DllCall( "DestroyIcon", "Ptr",hICON )  ; Destroy original HICON

Gui, Show, w400 h200, TrayIcon with in-script Base64 PNG image raw data
Return 

Base64toHICON() { ; 16x16 PNG image (236 bytes), requires WIN Vista and later
Local B64 := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAs0lEQVQ4jbXTO27CUBCF4e9a7rIJECugZ"
. "QlZQhoUSmihg8rpqKEOTZbAEihhBUjsxBSWEZYY2Qrwl/fM49zRTDoWYIwVBrpxRoFdjik2HRNrBvjFR455/TpclreI0"
. "09qZATaPEPvUYu/Q9z+TutlSHFoKyl7IhnkkbDel5HU4H0OFp/N0USOwgLwNWp38PQXXlKg27gfU+a4oE+1otEGBtolH"
. "Yt/HVPNLMMWE9WJduWMb2yvxO4l4nkelNAAAAAASUVORK5CYII=",       Bin, Blen, nBytes:=236, hICON:=0                     
  
  VarSetCapacity( Bin,nBytes,0 ), BLen := StrLen(B64)
  If DllCall( "Crypt32.dll\CryptStringToBinary", "Str",B64, "UInt",BLen, "UInt",0x1
            , "Ptr",&Bin, "UIntP",nBytes, "Int",0, "Int",0 )
     hICON := DllCall( "CreateIconFromResourceEx", "Ptr",&Bin, "UInt",nBytes, "Int",True
                     , "UInt",0x30000, "Int",16, "Int",16, "UInt",0, "UPtr" )            
Return hICON
}
Attachments
H.png
(236 Bytes) Downloaded 348 times
My Scripts and Functions: V1  V2
User avatar
SpeedMaster
Posts: 494
Joined: 12 Nov 2016, 16:09

Re: Base64 to HICON : Native PNG Decompression (requires WIN VISTA and later)

04 Sep 2017, 08:22

Great script! Thanks ! :dance:
example: with Bart Simpson :lol:

Code: Select all

#NoEnv
#SingleInstance, Force
#NoTrayIcon
Menu, Tray, UseErrorLevel

PNG16x16 := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAVFBMVEUAAABzXBdkUBVwWhYmHQtNPhR1Yi8xJwlSQiNmTx0tJxVjQk5QME6XeR6SdR3/zDN/Zhm/mSb///+/v79/TH8/Jj8/Mwy/cr9/ckw/DAz/mf9/f3/ie28vAAAAD3RSTlMAv3+/v38/v3+/vz8/Pz/96/+UAAAAeElEQVQY012M2xKDIAwFQfDSa05CwNr+/38WFHSGfcvOyZrM7KwdrHVvUwEzcSbNTVAFvRg6wa8muo87iMFZ2OOegnyCBD4TS5CfiOBqJuwLhruaKA206JRKkQlLFSPRsbmZZkaPslm9OfEKrF/VR8vEuG0aVePzD5ayCTRkTSbeAAAAAElFTkSuQmCC"
hICON := Base64PNG_to_HICON( PNG16x16 )  ; Create a HICON for Tray

Menu, Tray, Icon, HICON:*%hICON%                      ; AHK makes a copy of HICON when * is used
Menu, Tray, Icon
DllCall( "DestroyIcon", "Ptr",hICON  )                ; Destroy original HICON


PNG256x256 := "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"
hICON := Base64PNG_to_HICON( PNG256x256)

Gui, Margin, 20, 20
Gui, Add, Picture,gname, HICON:%hICON%
Gui, Show,, Base64PNG_to_HICON() DEMO 
Return ;     // end of auto-execcute section //

name:
msgbox, Bart Simpson
return

guiclose:
ExitApp
return


;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Base64PNG_to_HICON( B64, nBytes:="", W:="", H:="" ) {
Local Bin, BLen, hICON:=0  
if !nBytes
nBytes := ceil(strlen(strReplace( B64,"=","=",e))/4*3)-e
 
  VarSetCapacity( Bin,nBytes,0 ), BLen := StrLen(B64)
  If DllCall( "Crypt32.dll\CryptStringToBinary", "Str",B64, "UInt",BLen, "UInt",0x1
            , "Ptr",&Bin, "UIntP",nBytes, "Int",0, "Int",0 )
     hICON := DllCall( "CreateIconFromResourceEx", "Ptr",&Bin, "UInt",nBytes, "Int",True
                     , "UInt",0x30000, "Int",W, "Int",H, "UInt",0, "UPtr" )            
Return hICON
}
Attachments
Bart_Simpson_Skate.png
(11.3 KiB) Downloaded 125 times
Last edited by SpeedMaster on 05 Sep 2017, 05:17, edited 5 times in total.
User avatar
SKAN
Posts: 1551
Joined: 29 Sep 2013, 16:58

Re: Base64 to HICON : Native PNG Decompression (requires WIN VISTA and later)

04 Sep 2017, 08:33

SpeedMaster wrote:Great script! Thanks ! :dance:
example: with Bart Simpson :lol:
Thanks. Very nice!
BTW, why have you commented out API DestroyIcon()?
My Scripts and Functions: V1  V2
User avatar
SKAN
Posts: 1551
Joined: 29 Sep 2013, 16:58

Re: Base64 to HICON : Native PNG Decompression (requires WIN VISTA and later)

04 Sep 2017, 09:46

I have refined Base64ToHICON() version of SpeedMaster
Using a very tiny PNG 10x10 (109 bytes) resized to 48x48 icon.

Code: Select all

#NoEnv
#SingleInstance, Force
#NoTrayIcon
Menu, Tray, UseErrorLevel

PNG10x10 := "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKAgMAAADwXCcuAAAACVBMVEXOgwD///90SQCsNO1SAA"
          . "AAH0lEQVQI12MAARFWBgYx1gYwFg0F0ksb4HwupgaQEgBelQU38+DeFgAAAABJRU5ErkJggg=="
hICON := Base64toHICON( PNG10x10, 109, 48, 48 )  ; Create a HICON

Menu, Tray, Icon, HICON:*%hICON%                 ; AHK makes a copy of HICON when * is used
Menu, Tray, Icon
DllCall( "DestroyIcon", "Ptr",hICON  )           ; Destroy original HICON

Gui, Show, w400 h200, TrayIcon with in-script Base64 PNG image raw data
Return 


Base64toHICON( B64, nBytes, W:=16, H:=16 ) {
Local Bin, BLen, hICON:=0                     
  VarSetCapacity( Bin,nBytes,0 ), BLen := StrLen(B64)
  If DllCall( "Crypt32.dll\CryptStringToBinary", "Str",B64, "UInt",BLen, "UInt",0x1
            , "Ptr",&Bin, "UIntP",nBytes, "Int",0, "Int",0 )
     hICON := DllCall( "CreateIconFromResourceEx", "Ptr",&Bin, "UInt",nBytes, "Int",True
                     , "UInt",0x30000, "Int",W, "Int",H, "UInt",0, "UPtr" )            
Return hICON
}
Attachments
PNG10x10.png
(109 Bytes) Downloaded 343 times
My Scripts and Functions: V1  V2
User avatar
SpeedMaster
Posts: 494
Joined: 12 Nov 2016, 16:09

Re: Base64 to HICON : Native PNG Decompression (requires WIN VISTA and later)

04 Sep 2017, 10:04

SKAN wrote:BTW, why have you commented out API DestroyIcon()?
Oops, sorry :roll:
The script did not work the first time. :cry:
I thought maybe it was because of that. :roll:
After a some tests, I finally found that it was necessary to specify the exact file size. :!:
Base64toHICON(icon,bytes)
Helgef
Posts: 4709
Joined: 17 Jul 2016, 01:02
Contact:

Re: Base64 to HICON : Native PNG Decompression (requires WIN VISTA and later)

04 Sep 2017, 10:05

wikipedia wrote:The ratio of output bytes to input bytes is 4:3 (33% overhead). Specifically, given an input of n bytes, the output will be {\displaystyle 4\lceil n/3\rceil } 4 \lceil n/3 \rceil bytes long, including padding characters.
So bytes := ceil(strlen(strReplace( B64,"="))/4*3) :?: Edit: Maybe needs ceil. Lol, I didn't see the ciel symbol in the wiki article but noticed the \lceil \rceil from the copy-paste. Edit2: ceil symbol, ⌈ ⌉ (Send {u+2308}{u+2309} :) )
User avatar
SpeedMaster
Posts: 494
Joined: 12 Nov 2016, 16:09

Re: Base64 to HICON : Native PNG Decompression (requires WIN VISTA and later)

04 Sep 2017, 11:44

Helgef wrote: bytes := ceil(strlen(strReplace( B64,"="))/4*3)
Thanks, Helgef. :thumbup:
I updated my previous post with this formula with new formula.
It seems to work well. So no need to specify the file size.
Last edited by SpeedMaster on 05 Sep 2017, 04:44, edited 2 times in total.
User avatar
jeeswg
Posts: 6902
Joined: 19 Dec 2016, 01:58
Location: UK

Re: Base64 to HICON : Native PNG Decompression (requires WIN VISTA and later)

04 Sep 2017, 13:34

hex (uses 16 characters):
n bytes, need 2*n characters
[256] -> [16][16]
[256][256] -> [16][16][16][16]
[256][256][256] -> [16][16][16][16][16][16]

[256] -> [aaaa][aaaa]
[256][256] -> [aaaa][aaaa][bbbb][bbbb]
[256][256][256] -> [aaaa][aaaa][bbbb][bbbb][cccc][cccc]

base64 (uses 64 characters):
n bytes, need Ceil((4/3)*n) characters [note: 4/3 = 1.333333...]
[256] -> [64][4|(16)]
[256][256] -> [64][4|16][16|(4)]
[256][256][256] -> [64][4|16][16|4][64]

[256] -> [aaaaaa][aa|####]
[256][256] -> [aaaaaa][aa|bbbb][bbbb|##]
[256][256][256] -> [aaaaaa][aa|bbbb][bbbb|cc][cccccc]

n bytes -> Ceil((4/3)*n) characters [excluding =]
n characters [excluding =] -> Floor((3/4)*n) bytes

vCharsExclEquals := Ceil((4/3)*vSizeData)
vSizeData := Floor((3/4)*vCharsExclEquals)
Last edited by jeeswg on 04 Sep 2017, 16:04, edited 3 times in total.
homepage | tutorials | wish list | fun threads | donate
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
User avatar
SKAN
Posts: 1551
Joined: 29 Sep 2013, 16:58

Re: Base64 to HICON : Native PNG Decompression (requires WIN VISTA and later)

04 Sep 2017, 15:18

CryptStringToBinary() returns correct required size even when output is 1 byte.
Helgef wrote:So bytes := ceil(strlen(strReplace( B64,"="))/4*3)
Doesn't seem to give consistent results.

Here is my test script:

Code: Select all

#NoEnv
#SingleInstance, Force


FileRead, Bin, *c %A_AhkPath%
Loop 300 {

  B64 := Base64Enc( Bin, A_Index, 400, 0 )
  bytes := ceil(strlen(strReplace( B64,"="))/4*3)

MsgBox % "[" B64 "]`nActual size: " A_Index "`nYour formula yeilds: "  bytes 
}  

Base64Enc( ByRef Bin, nBytes, LineLength := 64, LeadingSpaces := 0 ) { ; By SKAN / 18-Aug-2017
Local Rqd := 0, B64, B := "", N := 0 - LineLength + 1  ; CRYPT_STRING_BASE64 := 0x1
  DllCall( "Crypt32.dll\CryptBinaryToString", "Ptr",&Bin ,"UInt",nBytes, "UInt",0x1, "Ptr",0,   "UIntP",Rqd )
  VarSetCapacity( B64, Rqd * ( A_Isunicode ? 2 : 1 ), 0 )
  DllCall( "Crypt32.dll\CryptBinaryToString", "Ptr",&Bin, "UInt",nBytes, "UInt",0x1, "Str",B64, "UIntP",Rqd )
  If ( LineLength = 64 and ! LeadingSpaces )
    Return B64
  B64 := StrReplace( B64, "`r`n" )        
  Loop % Ceil( StrLen(B64) / LineLength )
    B .= Format("{1:" LeadingSpaces "s}","" ) . SubStr( B64, N += LineLength, LineLength ) . "`n" 
Return RTrim( B,"`n" )    
}

My Scripts and Functions: V1  V2
User avatar
jeeswg
Posts: 6902
Joined: 19 Dec 2016, 01:58
Location: UK

Re: Base64PNG_to_HICON() : Uses native PNG Decompression (requires WIN VISTA and later)

04 Sep 2017, 16:00

This formula works for me using that test, the original calculation appears to be doing the inverse of what it should be doing. [EDIT: The approximate inverse, not the exact inverse.] Also see my post above.

Code: Select all

bytes := floor(strlen(strReplace( B64,"="))*3/4)
I suppose there could be some potential confusion, in that you might want to know how many bytes the string would need if stored in an ANSI plaintext file. Hence I've tried to be extra clear in my examples in a post above.

In the code in this post, 'bytes' refers to the size of the original binary data.
Last edited by jeeswg on 05 Sep 2017, 02:51, edited 1 time in total.
homepage | tutorials | wish list | fun threads | donate
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
User avatar
SKAN
Posts: 1551
Joined: 29 Sep 2013, 16:58

Re: Base64PNG_to_HICON() : Uses native PNG Decompression (requires WIN VISTA and later)

04 Sep 2017, 16:10

jeeswg wrote:

Code: Select all

bytes := floor(strlen(strReplace( B64,"="))*3/4)
Yes! :bravo: :D

I think RTrim() would be faster than StrReplace() : bytes := floor(strlen(RTrim( B64,"="))*3/4)
My Scripts and Functions: V1  V2
User avatar
SpeedMaster
Posts: 494
Joined: 12 Nov 2016, 16:09

Re: Base64PNG_to_HICON() : Uses native PNG Decompression (requires WIN VISTA and later)

04 Sep 2017, 16:52

According to the function found in this post :
https://stackoverflow.com/questions/133 ... alculation
result = (Math.ceil(base64String.length() / 4) * 3 ) - padding

transcribed into ahk: :think:

Code: Select all

  strReplace( B64,"=","=",padding)
  bytes := (ceil(strlen(B64)/4)*3)-padding
Helgef
Posts: 4709
Joined: 17 Jul 2016, 01:02
Contact:

Re: Base64PNG_to_HICON() : Uses native PNG Decompression (requires WIN VISTA and later)

04 Sep 2017, 17:37

I didn't read carefully enough, my original proposal is ofc not right, it (the quote, not the code) can be useful to go from binary length to string length. To go from string length to binary length, I see this quote just below my original wiki-quote,
wikipedia wrote:When decoding Base64 text, four characters are typically converted back to three bytes. The only exceptions are when padding characters exist. A single '=' indicates that the four characters will decode to only two bytes, while '==' indicates that the four characters will decode to only a single byte
source
So,

Code: Select all

reqBytes(B64){
	local e,l
	strreplace(B64,"=","=",e),strreplace(B64,"`n","`n",l)
	return (strlen(B64)-l) / 4 * 3 - (e == 1 ? 1 : (e == 2 ? 2 : 0))
}
I adjust the string length if there are linebreaks `n, beacuse I saw you added some. And because I saw you removed some, note CryptBinaryToStringhas flag CRYPT_STRING_NOCRLF=0x40000000 for omitting linebreaks.

Cheers.
@ SpeedMaster, Edit: A new day, new eyes, that it is correct :lol:
Last edited by Helgef on 05 Sep 2017, 01:45, edited 1 time in total.
User avatar
SKAN
Posts: 1551
Joined: 29 Sep 2013, 16:58

Re: Base64PNG_to_HICON() : Uses native PNG Decompression (requires WIN VISTA and later)

04 Sep 2017, 18:35

Helgef wrote:I adjust the string length if there are linebreaks `n, beacuse I saw you added some.
It doesn't matter when JOIN option of string concatenation is in effect.
And because I saw you removed some, note CryptBinaryToStringhas flag CRYPT_STRING_NOCRLF=0x40000000 for omitting linebreaks.
The flag is not supported in XP. RAW HEX is also not supported in XP, and hence Base64 is now my preferred format.

:)
My Scripts and Functions: V1  V2
Helgef
Posts: 4709
Joined: 17 Jul 2016, 01:02
Contact:

Re: Base64PNG_to_HICON() : Uses native PNG Decompression (requires WIN VISTA and later)

05 Sep 2017, 02:19

Ok. For the record, strlen(strReplace( B64,"=","=",e))/4*3-e is the exact formula, short of float errors, so you could round it. But I prefer strlen(B64)/4*3 for readabillity, it will always be either the exact required size, 1 or 2 bytes to much. So it will always work and be fastest. Again, maybe round it too, because of float errors.

@ jeeswg, the EDIT:floor version works because you remove 1 or 2 characters and floor(1 * 4 / 3=1.333333)=1 and floor(2 * 4 / 3=2.666667)=2, not because floor is the inverse of ceil (which it is isn't).

@ SKAN XP ? :o :lol: It is probably the best we'll ever see though, in terms of reliabillity and overall performance.

Finally, sorry for derailing the thread.

Cheers.

Edit: @ jeeswg, I meant the floor version, not the ceil version,
Last edited by Helgef on 05 Sep 2017, 13:30, edited 1 time in total.
User avatar
SpeedMaster
Posts: 494
Joined: 12 Nov 2016, 16:09

Re: Base64PNG_to_HICON() : Uses native PNG Decompression (requires WIN VISTA and later)

05 Sep 2017, 04:41

Helgef wrote:Ok. For the record, strlen(strReplace( B64,"=","=",e))/4*3-e is the exact formula
Cheers.
Thanks, Helgef :thumbup:
I updated my previous post (Bart Simpson example) with the new formula.
nBytes will be automatically calculated if they are not specified. 8-)
User avatar
SKAN
Posts: 1551
Joined: 29 Sep 2013, 16:58

Re: Base64PNG_to_HICON() : Uses native PNG Decompression (requires WIN VISTA and later)

05 Sep 2017, 07:01

Helgef wrote:@ SKAN XP ? :o :lol: It is probably the best we'll ever see though, in terms of reliabillity and overall performance.
AutoHotkey 1.1 works from Win2k, I guess
While writing a whole app with XP support might not be a great idea, at least standalone functions ( like my Base encoder/decoder ) should be compatible with XP.
Its my policy. I will specifically mention, if my function is not meant for XP.
Helgef wrote:Finally, sorry for derailing the thread.
Not at all.
The conversation is important to me.
While the "textbook" method is to call CryptStringToBinary() twice, once to ascertain the length and a consecutive call to decode base64,
I have avoided it here as Crypt32.dll will be loaded and freed twice.

My Base64Dec() does it. A perfect one-liner to avoid the additional DllCall() would be a good improvement for that function.

Thanks to all of you for the feedback.
My Scripts and Functions: V1  V2

Return to “Scripts and Functions (v1)”

Who is online

Users browsing this forum: wilkster and 109 guests