代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
C
】
编码转换
作者:
Dezai.CN
/ 发布于
2011/2/10
/
589
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <sys/types.h></div> <div>define BUFSIZE 256</div> <div>typedef enum BType { Nothing = 0, BString, BInt, BList, BDict } BType;</div> <div>struct Bencoding;</div> <div>typedef struct ListNode { struct Bencoding *cargo; struct ListNode *next; } ListNode;</div> <div>typedef struct DictNode { char *key; struct Bencoding *value; struct DictNode *next; } DictNode;</div> <div>typedef struct Bencoding { BType type; union { long long val; // used when type == BInt ListNode *list; // used when type == BList char *str; // used when type == BString DictNode *dict; } cargo; // data } Bencoding;</div> <div>Bencoding* parse_bencoding();</div> <div>Bencoding* new_bencoding() { return malloc(sizeof(Bencoding)); } <div>ListNode* new_listnode() { return malloc(sizeof(ListNode)); } <div>DictNode* new_dictnode() { return malloc(sizeof(DictNode)); } <div>Bencoding* new_bint(int val) { Bencoding *b = new_bencoding(); b->type = BInt; b->cargo.val = val; return b; } <div>Bencoding* new_blist(ListNode *l) { Bencoding *b = new_bencoding(); b->type = BList; b->cargo.list = l; return b; } <div>Bencoding* new_bstring(char *s, int len) { Bencoding *b = new_bencoding(); b->type = BString; b->cargo.str = s; return b; } <div>Bencoding* new_bdict(DictNode *d) { Bencoding *b = new_bencoding(); b->type = BDict; b->cargo.dict = d; return b; } <div>void failed() { printf("Parse FAILED\n"); exit(1); } <div>char buf[BUFSIZE]; int pos = 0; int buf_lim = 0;</div> <div>char reloadBuffer() { buf_lim = fread(buf, 1, BUFSIZE, stdin); pos = 0; } <div>void checkBufReady() { if (pos >= buf_lim) reloadBuffer(); } <div>char peekChar() { checkBufReady(); return buf[pos]; } <div>char getChar() { checkBufReady(); return buf[pos++]; } <div>void matchChar(char c) { if (getChar() != c) failed(); } <div>Bencoding* parse_int() { matchChar('i'); long long val = 0; while (isdigit(peekChar())) val = val*10 + (getChar() - '0'); matchChar('e');</div> <div>return new_bint(val); } <div>Bencoding* parse_list() { matchChar('l'); ListNode l; ListNode *c = &l; while (peekChar() != 'e') { c->next = new_listnode(); c = c->next; c->cargo = parse_bencoding(); c->next = 0; } matchChar('e'); return new_blist(l.next); } <div>Bencoding* parse_string() { int len = 0; while (isdigit(peekChar())) len = len*10 + (getChar() - '0'); matchChar(':'); char *s = malloc(sizeof(char)*(len+1)); int i; for (i = 0; i < len; ++i) s[i] = getChar(); s[len] = 0; return new_bstring(s, len+1); } <div>Bencoding* parse_dict() { matchChar('d'); DictNode d; DictNode *c = &d; while (peekChar() != 'e') { c->next = new_dictnode(); c = c->next; Bencoding *s = parse_string(); c->key = s->cargo.str; free(s); c->value = parse_bencoding(); c->next = 0; } matchChar('e'); return new_bdict(d.next); } <div>Bencoding* parse_bencoding() { char c = peekChar(); switch (c) { case 'd': return parse_dict(); case 'l': return parse_list(); case 'i': return parse_int(); default: return parse_string(); } } <div>void print_indent(int indent) { int i; for (i = 0; i < indent; ++i) printf(" "); } <div> void print_bencoding(Bencoding *b, int indent) { print_indent(indent); switch (b->type) { case BInt: printf("%lld\n", b->cargo.val); break; case BList: printf("[\n"); ListNode *c = b->cargo.list; while (c) { print_bencoding(c->cargo, indent+1); c = c->next; } print_indent(indent); printf("]\n"); break; case BString: printf("%s\n", b->cargo.str); break; case BDict: printf("{\n"); DictNode *d = b->cargo.dict; while (d) { print_indent(indent+1); printf("%s ==>\n", d->key); print_bencoding(d->value, indent+2); d = d->next; } print_indent(indent); printf("}\n"); break; } } <div>int main(int argc, char *argv[]) { Bencoding* b = parse_bencoding();</div> <div>print_bencoding(b, 0);</div> <div>return 0; } </div>
试试其它关键字
同语言下
.
获取手机通讯录 iOS去除数字以外的所有字符
.
异步加载音乐等资源
.
交通罚单管理系统
.
freemark实现,简单的替换
.
计算斐波那契数列
.
base64解码 包括解码长度
.
图像显示
.
冒泡排序
.
输入十进制数,输出指定进制
.
链式栈
可能有用的
.
获取手机通讯录 iOS去除数字以外的所有字符
.
异步加载音乐等资源
.
交通罚单管理系统
.
freemark实现,简单的替换
.
计算斐波那契数列
.
base64解码 包括解码长度
.
图像显示
.
冒泡排序
.
输入十进制数,输出指定进制
.
链式栈
Dezai.CN
贡献的其它代码
(
4037
)
.
多线程Socket服务器模块
.
生成随机密码
.
清除浮动样式
.
弹出窗口居中
.
抓取url的函数
.
使用base HTTP验证
.
div模拟iframe嵌入效果
.
通过header转向的方法
.
Session操作类
.
执行sqlite输入插入操作后获得自动编号的ID
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3