日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言实现encode和decode

發布時間:2025/3/21 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言实现encode和decode 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
此文章出處:http://www.cppblog.com/izualzhy/archive/2012/07/09/182456.html
Technorati 標簽:?urlencode,urldecode

先看個例子:

漢字 一 的UTF-8編碼為0xE4 0xb8 0x 80

我們在google里搜索一下“一”,地址欄顯示為:

可以看到url的字符串里有一個%E4%B8%80

這就是encode之后的值。因此,encode的處理過程也很明顯了。

特別是傳中文參數時,如果沒有encode,很容易出錯。

至于為什么要這么傳,就不知道了,今天,現來看下C語言如何實現url encode函數.

首先是urlencode的編碼規則,可以看這里,搜到一篇文章沒有仔細研究,可能有不全的地方:

http://hi.baidu.com/leejun_2005/item/9e0f4e4ba62cde0bc11613b5
解碼:

/** =====================================================================================* Filename: url_decode.cpp* Description: url decode** Created: 07/06/2012 07:35:14 PM* Author: zhy (), izualzhy@163.com* =====================================================================================*/#include <stdio.h> #include <string.h>#define NON_NUM '0'int hex2num(char c) {if (c>='0' && c<='9') return c - '0';if (c>='a' && c<='z') return c - 'a' + 10;//這里+10的原因是:比如16進制的a值為10if (c>='A' && c<='Z') return c - 'A' + 10;printf("unexpected char: %c", c);return NON_NUM; }/*** @brief URLDecode 對字符串URL解碼,編碼的逆過程** @param str 原字符串* @param strSize 原字符串大小(不包括最后的\0)* @param result 結果字符串緩存區* @param resultSize 結果地址的緩沖區大小(包括最后的\0)** @return: >0 result 里實際有效的字符串長度* 0 解碼失敗*/ int URLDecode(const char* str, const int strSize, char* result, const int resultSize) {char ch,ch1,ch2;int i;int j = 0;//record result indexif ((str==NULL) || (result==NULL) || (strSize<=0) || (resultSize<=0)) {return 0;}for ( i=0; (i<strSize) && (j<resultSize); ++i) {ch = str[i];switch (ch) {case '+':result[j++] = ' ';break;case '%':if (i+2<strSize) {ch1 = hex2num(str[i+1]);//高4位ch2 = hex2num(str[i+2]);//低4位if ((ch1!=NON_NUM) && (ch2!=NON_NUM))result[j++] = (char)((ch1<<4) | ch2);i += 2;break;} else {break;}default:result[j++] = ch;break;}}result[j] = 0;return j; }int main(int argc, char* argv[]) {char* src = argv[1];char obj[100] = {0};unsigned int len = strlen(src);int resultSize = URLDecode(src, len, obj, 100);printf("result: %d, %s\n", resultSize, obj);return 0;}

編碼:

/** =====================================================================================* Filename: url_encode.cpp* Description: url encode** Created: 07/04/2012 08:32:24 PM** Author: zhy (), izualzhy@163.com* =====================================================================================*/ #include <stdio.h> #include <string.h>/*** @brief URLEncode 對字符串URL編碼** @param str 原字符串* @param strSize 原字符串長度(不包括最后的\0)* @param result 結果緩沖區的地址* @param resultSize 結果緩沖區的大小(包括最后的\0)** @return: >0:resultstring 里實際有效的長度* 0: 解碼失敗.*/ int URLEncode(const char* str, const int strSize, char* result, const int resultSize) {int i;int j = 0;//for result indexchar ch;if ((str==NULL) || (result==NULL) || (strSize<=0) || (resultSize<=0)) {return 0;}for ( i=0; (i<strSize)&&(j<resultSize); ++i) {ch = str[i];if (((ch>='A') && (ch<'Z')) ||((ch>='a') && (ch<'z')) ||((ch>='0') && (ch<'9'))) {result[j++] = ch;} else if (ch == ' ') {result[j++] = '+';} else if (ch == '.' || ch == '-' || ch == '_' || ch == '*') {result[j++] = ch;} else {if (j+3 < resultSize) {sprintf(result+j, "%%%02X", (unsigned char)ch);j += 3;} else {return 0;}}}result[j] = '\0';return j; }int main(int argc, char* argv[]) {char* src = argv[1];unsigned int srclength = strlen(src);printf("src length: %d\n", strlen(src));char obj[100] = {0};URLEncode(src, srclength, obj, 100);printf("obj: %s\n", obj);printf("obj: %d\n", strlen(obj));return 0; }

輸出:

y@y-VirtualBox:/mnt/Documents/Training$ ./url_encode 一^abc_二
src length: 11
obj: %E4%B8%80%5Eabc_%E4%BA%8C
obj: 25
y@y-VirtualBox:/mnt/Documents/Training$ ./url_decode %E4%B8%80%5Eabc_%E4%BA%8C
result: 11, 一^abc_二

使用google搜索下:


注:

1.AA –> “%AA”,使用sprintf。

2.”%AA” –> AA, 使用位移。

參考:

http://hi.baidu.com/zkheartboy/blog/item/5813a28fa0d224ebf11f363d.html

http://hi.baidu.com/leejun_2005/item/9e0f4e4ba62cde0bc11613b5

總結

以上是生活随笔為你收集整理的C语言实现encode和decode的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。