base64和"%02x"编码比较

Base64编码


最重要的事情放第一行:参考男神阮一峰的base64博客


按照男神说法,base64核心是把24位二进制bit分为4组,每组6位bit,再在每组前加两个bit的0,新的每组为8位bit,共32位bit。以新的8位bit组来映射字符集,8位共0-63种状态,映射关系如 : 0 -> A 、 1->B  、 63->/ 、  垫字符= 

显然的,编码后的字符量会增加约25%


"%02x"编码


二进制bit以16进制的字符表示

x:输入表示二进制

02:输出至少2位字符,不足的前面加"0"字符


SecureRandom random = SecureRandom.getInstanceStrong();

byte[] temp = new byte[20];

random.nextBytes(temp);

StringBuffer sb = new StringBuffer();

for (byte b : temp) {

       sb.append(String.format("%02x",b));
}

String out = sb.toString();


编码效果如 : 00011000 -> "19"

这样一个byte会变成2个字符,相比一个byte对应一个字符的编码方式,编码量增加50%


小弟认为,base64比%02x编码方式更加节约空间


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC中可以使用CryptEncodeObject和CryptDecodeObject函数来进行Base64编码和解码。具体步骤如下: 1. 将要编码的数据存储在BYTE数组中。 2. 创建一个CRYPT_ENCODE_PARA结构体,设置其中的cbSize和dwFlags字段。 3. 调用CryptEncodeObject函数,将要编码的数据和一个要编码的对象类型(例如PKCS_7_ASN_ENCODING)传递给它,它将返回一个指向编码数据的指针和编码数据的长度。 4. 将编码数据转换为字符串并返回。 以下是一个示例函数,它将一个BYTE数组进行Base64编码并返回编码后的字符串: ``` CString Base64Encode(BYTE* pData, DWORD dwDataLen) { DWORD dwEncodedLen = 0; BYTE* pEncodedData = NULL; // 创建CRYPT_ENCODE_PARA结构体 CRYPT_ENCODE_PARA encodeParams = { sizeof(CRYPT_ENCODE_PARA), 0 }; // 编码数据 if (!CryptEncodeObject(PKCS_7_ASN_ENCODING, X509_OCTET_STRING, pData, &encodeParams, NULL, &dwEncodedLen)) return ""; pEncodedData = new BYTE[dwEncodedLen]; if (!CryptEncodeObject(PKCS_7_ASN_ENCODING, X509_OCTET_STRING, pData, &encodeParams, pEncodedData, &dwEncodedLen)) { delete[] pEncodedData; return ""; } // 将编码数据转换为字符串 CString strEncodedData; CRYPT_STRING_BASE64HEADER | CRYPT_STRING_NOCRLF | CRYPT_STRING_STRICT; if (!CryptBinaryToString(pEncodedData, dwEncodedLen, dwFlags, NULL, &dwEncodedLen)) { delete[] pEncodedData; return ""; } strEncodedData.GetBufferSetLength(dwEncodedLen); if (!CryptBinaryToString(pEncodedData, dwEncodedLen, dwFlags, strEncodedData.GetBuffer(), &dwEncodedLen)) { strEncodedData.ReleaseBuffer(0); delete[] pEncodedData; return ""; } strEncodedData.ReleaseBuffer(); delete[] pEncodedData; return strEncodedData; } ``` 注意,需要在使用完后手动删除pEncodedData指针对应的内存。同时,为了方便起见,我使用了MFC的CString类来处理字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值