base64 c语言,C/C++版实现(Base64, UrlEncode等)

本文提供C/C++实现的Base64编码及解码、UrlEncode、获取本机IP和MAC地址等功能代码。Base64编码将每三个字节转换为四个ASCII字符,UrlEncode则将特殊字符转为十六进制表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#####阅读原文

C/C++版实现(Base64, UrlEncode等)

【原创性声明】:本文无实质性创新性内容,性质属于技术总结,内容是基于已有知识或定义的代码实现。文中的代码是我根据其他代码或者网络上的资料,写出的自己的版本。因为网络上的代码 C/C++ 版本的较少,或者本身不一定是最合适最容易使用的。所以我写的代码基本是以 C 语言和 C 字符串处理为主的,因此它也可以直接在 C++ 的项目中使用。

(1)Base64 编码。Base64 编码是把每 3 个字节转换成 4 个ascii 字符(根据字符表映射)。把文本编码后,对人来说难以直接阅读。结尾不足时可能有一到两个 “=” 字符的补齐。

复制代码

//以下是 Base64.h 的内容:

size_t Base64_Decode(char pDest, const charpSrc, size_t srclen);

size_t Base64_Encode(char pDest, const charpSrc, size_t srclen);

//以下是 Base64.cpp 的内容:

BYTE Decode_GetByte(char c);

char Encode_GetChar(BYTE num);

//===================================

// Base64 解码

//===================================

BYTE Decode_GetByte(char c)

{

if(c == ‘+’)

return 62;

else if(c == ‘/‘)

return 63;

else if(c <= ‘9’)

return (BYTE)(c - ‘0’ + 52);

else if(c == ‘=’)

return 64;

else if(c <= ‘Z’)

return (BYTE)(c - ‘A’);

else if(c <= ‘z’)

return (BYTE)(c - ‘a’ + 26);

return 64;

}

//解码

size_t Base64_Decode(char pDest, const charpSrc, size_t srclen)

{

BYTE input[4];

size_t i, index = 0;

for(i = 0; i < srclen; i += 4)

{

//byte[0]

input[0] = Decode_GetByte(pSrc[i]);

input[1] = Decode_GetByte(pSrc[i + 1]);

pDest[index++] = (input[0] << 2) + (input[1] >> 4);

//byte[1]

if(pSrc[i + 2] != '=')

{

input[2] = Decode_GetByte(pSrc[i + 2]);

pDest[index++] = ((input[1] & 0x0f) << 4) + (input[2] >> 2);

}

//byte[2]

if(pSrc[i + 3] != '=')

{

input[3] = Decode_GetByte(pSrc[i + 3]);

pDest[index++] = ((input[2] & 0x03) << 6) + (input[3]);

}

}

//null-terminator

pDest[index] = 0;

return index;

}

//===================================

// Base64 编码

//===================================

char Encode_GetChar(BYTE num)

{

return

“ABCDEFGHIJKLMNOPQRSTUVWXYZ”

“abcdefghijklmnopqrstuvwxyz”

“0123456789”

“+/=”[num];

}

//编码

size_t Base64_Encode(char pDest, const charpSrc, size_t srclen)

{

BYTE input[3], output[4];

size_t i, index_src = 0, index_dest = 0;

for(i = 0; i < srclen; i += 3)

{

//char [0]

input[0] = pSrc[index_src++];

output[0] = (BYTE)(input[0] >> 2);

pDest[index_dest++] = Encode_GetChar(output[0]);

//char [1]

if(index_src < srclen)

{

input[1] = pSrc[index_src++];

output[1] = (BYTE)(((input[0] & 0x03) << 4) + (input[1] >> 4));

pDest[index_dest++] = Encode_GetChar(output[1]);

}

else

{

output[1] = (BYTE)((input[0] & 0x03) << 4);

pDest[index_dest++] = Encode_GetChar(output[1]);

pDest[index_dest++] = '=';

pDest[index_dest++] = '=';

break;

}

//char [2]

if(index_src < srclen)

{

input[2] = pSrc[index_src++];

output[2] = (BYTE)(((input[1] & 0x0f) << 2) + (input[2] >> 6));

pDest[index_dest++] = Encode_GetChar(output[2]);

}

else

{

output[2] = (BYTE)((input[1] & 0x0f) << 2);

pDest[index_dest++] = Encode_GetChar(output[2]);

pDest[index_dest++] = '=';

break;

}

//char [3]

output[3] = (BYTE)(input[2] & 0x3f);

pDest[index_dest++] = Encode_GetChar(output[3]);

}

//null-terminator

pDest[index_dest] = 0;

return index_dest;

}

复制代码

(2)UrlEncode (百分号编码)。方法是把输入的字符串先用 UTF-8 编码,然后把基本字符以外的字节用百分号加16进制的形式编码。UrlEncode 的最后一个参数含义是,编码结果中的16进制字符是否采用大写字母表示。

code_UrlEncode

(3)获取本机 IP 地址和网卡物理地址。可能有多个网络适配器,但这里只是给出第一个适配器的结果。根据网络资料,获取网卡物理地址有多种方法。已知 IP 地址获取其物理地址可以使用 SendARP 方法。但对于本机来说,可以直接用 GetAdaptersAddresses 更适合,其返回结果为链表(list)形式。这里对 IP 默认为 IPv4(4个字节),网卡物理地址通常为 6 个字节。

code_GetMacAddress

(4)使用 SMTP 发送邮件。本文是参考看雪论坛上某文章中的代码。如果发送中文,应该在传输时,指定文本使用的编码,以防止接收端解释成乱码。以下代码引用了(1)中的 Base64 编码。

code_SendMail

(5)以 Post 形式发送 HTTP 请求。如果使用 C# 则可以使用 HttpRequest。由于是测试版本,以下代码在读取服务器响应时假设服务器的响应是短文本,因此没有判断服务器的响应是否已全部读取,并不是非常完善。在实际应用中应完善后使用。

code_HttpSendRequest

以下是 java 版本的类似代码:

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 Web@Cool02.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值