//bin 文本编码
import crypt;
namespace crypt.bin;
   
encode = ..crypt.encodeBin;
decode = ..crypt.decodeBin;

encodeBase64 = function(str,len,flags = 0x40000001/*_CRYPT_STRING_BASE64*/){
	return encode(str,len,flags);
}

decodeBase64 = function(str,len,flags = 1/*_CRYPT_STRING_BASE64*/){
	return decode(str,len,flags);
}

encodeUrlBase64 = function(str,len,padding){
	var bin = encode(str,len,0x40000001/*_CRYPT_STRING_BASE64*/);
	if(bin){
		bin = ..string.replace(bin,"[\+/]",{["+"]="-";["/"]="_"} );
    	return padding ? bin : ..string.trimright(bin,"=");
	}
}

decodeUrlBase64 = function(str,len){
    if(!str) return;
    str = ..string.replace(str,"@-","+");
    str = ..string.replace(str,"@_","/");
	return decode(str,len,1/*_CRYPT_STRING_BASE64*/);
}

encodeHex = function(str,len,flags = 0x40000004/*_CRYPT_STRING_HEX*/){
	return encode(str,len,flags); 
}

decodeHex = function(str,len,flags = 4/*_CRYPT_STRING_HEX*/){
	return decode(str,len,flags);
}

base64DataUrl = function(str,mime){
	return ..string.format('data:%s;base64,%s',mime: "text/plain; charset=UTF-8",..string.replace(encodeBase64(str),"\r\n","") ) 
}
 /**intellisense()
crypt.bin = BASE64加密解密\n简单封装 crypt.encodeBin 以及 crypt.decodeBin 函数
crypt.bin.encodeBase64(.(字符串,长度,选项) = Base64编码,\n字符串可以是指针,如果不是托管指针则应指定长度参数,\n否则长度参数可省略\n调用此函数不建议指定选项参数
crypt.bin.decodeBase64(.(字符串,长度,选项) = Base64解码,\n字符串可以是指针,如果不是托管指针则应指定长度参数,\n否则长度参数可省略\n调用此函数不建议指定选项参数
crypt.bin.encodeUrlBase64(.(字符串,长度,允许补等号) = UrlBase64编码,\n字符串可以是指针,如果不是托管指针则应指定长度参数,\n否则长度参数可省略\n\n返回字符串不包含用于尾部对齐的等号\n并且+替换为-,/替换为_，以保证作为URL参数可以安全传输
crypt.bin.decodeUrlBase64(.(字符串,长度) = UrlBase64解码,\n字符串可以是指针,如果不是托管指针则应指定长度参数,\n否则长度参数可省略\n
crypt.bin.encodeHex(.(字符串,长度,选项) = 16进制编码,移除返回字符串尾部回车换行
crypt.bin.decodeHex(.(字符串,长度,选项) = 16进制解码\n调用此函数不建议指定选项参数
crypt.bin.base64DataUrl(.(字符串,MIME) = 返回 Base64 格式 Data URL
_CRYPT_STRING_BASE64HEADER=@0/*_CRYPT_STRING_BASE64HEADER*/
_CRYPT_STRING_BASE64=@1/*_CRYPT_STRING_BASE64*/
_CRYPT_STRING_BINARY=@2/*_CRYPT_STRING_BINARY*/
_CRYPT_STRING_BASE64REQUESTHEADER=@3/*_CRYPT_STRING_BASE64REQUESTHEADER*/
_CRYPT_STRING_HEX=@4/*_CRYPT_STRING_HEX*/
_CRYPT_STRING_HEXASCII=@5/*_CRYPT_STRING_HEXASCII*/
_CRYPT_STRING_BASE64_ANY=@6/*_CRYPT_STRING_BASE64_ANY*/
_CRYPT_STRING_ANY=@7/*_CRYPT_STRING_ANY*/
_CRYPT_STRING_HEX_ANY=@8/*_CRYPT_STRING_HEX_ANY*/
_CRYPT_STRING_BASE64X509CRLHEADER=@9/*_CRYPT_STRING_BASE64X509CRLHEADER*/
_CRYPT_STRING_HEXADDR=@0xA/*_CRYPT_STRING_HEXADDR*/
_CRYPT_STRING_HEXASCIIADDR=@0xB/*_CRYPT_STRING_HEXASCIIADDR*/
_CRYPT_STRING_HEXRAW=@0xC/*_CRYPT_STRING_HEXRAW*/
_CRYPT_STRING_HASHDATA=@0x10000000/*_CRYPT_STRING_HASHDATA*/
_CRYPT_STRING_STRICT=@0x20000000/*_CRYPT_STRING_STRICT*/
_CRYPT_STRING_NOCRLF=@0x40000000/*_CRYPT_STRING_NOCRLF*/
_CRYPT_STRING_NOCR=@0x80000000/*_CRYPT_STRING_NOCR*/
end intellisense**/