2007-08-06
base64函数的学习程序
关键字: D语言 base64import std.stdio;
import std.base64;
void main()
{
char[] a;
char[] b;
char[] c;
// 方法1
a = "%%%abdsfds%";
a = "张33";
writefln("a string (%d):\t%s", a.length, a);
b = encode(a);
writefln("b string (%d):\t%s", b.length, b);
c = decode(b);
writefln("c string (%d):\t%s", c.length, c);
assert(c == a);
writefln();
// 方法2
char[] d;
char[] e = new char[100];
char[] f = new char[100];
e[] = 0;
f[] = 0;
d = "%%%ABCCCC%AFDSFDS%";
d = "CCCCAAFDSFDSAAAAAA";
d = "张33";
writefln("d string (%d):\t%s", d.length, d);
encode(d, e);
e.length = encodeLength(d.length);
writefln("e string (%d):\t%s", e.length, e);
decode(e, f);
f.length = decodeLength(e.length);
writefln("f string (%d):\t%s", f.length, f);
assert(d == f);
}
有两点不清楚:
1,最后的assert不正确。不清楚为什么,请教高手。
2,方法2的写法正确吗?数组的定义和初始化还不是十分清楚。
是不是e[] = 0;是多余的。
char[e] = new char[100]; 语句是不是就是分配100个字节空间?
这种写法会不会更好一些。
char[] e;
e.length = encodeLength(d.length);
2007年8月7日:
去把base64里面的函数调试了一下。发现encodeLength / decodeLength根本不是编码解码后的字符串长度,只是一个最大长度。传入的字符串应该大于等于这个长度,函数才继续执行而已。
传入的buffer长度和返回值的长度之间的关系(base64里面的unittestl例子):
引用
buffer: 3
return: f, 1
buffer: 3
return: fo, 2
buffer: 3
return: foo, 3
buffer: 6
return: foos, 4
buffer: 33
return: all your base64 are belong to foo, 33
buffer: 18
return: testing some more, 17
buffer: 9
return: asdf jkl;, 9
buffer: 12
return: base64 stuff, 12
buffer: 18
return: foo!, 18
return: f, 1
buffer: 3
return: fo, 2
buffer: 3
return: foo, 3
buffer: 6
return: foos, 4
buffer: 33
return: all your base64 are belong to foo, 33
buffer: 18
return: testing some more, 17
buffer: 9
return: asdf jkl;, 9
buffer: 12
return: base64 stuff, 12
buffer: 18
return: foo!, 18
评论
Colorful
2007-08-07
差别当然不是1,呵呵.
我那个,只是为了说明问题采用的临时解决方案。
我那个,只是为了说明问题采用的临时解决方案。
Colorful
2007-08-07
客气了,互相学习.
我采用%*s来打印输出,主要是使用了printf函数.
writefln函数不存在这个问题.
我采用%*s来打印输出,主要是使用了printf函数.
writefln函数不存在这个问题.
sofire
2007-08-07
//修正该问题
f.length = f.length -1;
assert(d == f);
差别不一定是1,我把encode/decode函数理解错误了。
在文章最后有一些测试结果。
f.length = f.length -1;
assert(d == f);
差别不一定是1,我把encode/decode函数理解错误了。
在文章最后有一些测试结果。
sofire
2007-08-07
谢谢 Colorful!
原来可以用 %*s 来打印,我看例子上是写的%.*s,得去看看手册上怎么说的。
原来可以用 %*s 来打印,我看例子上是写的%.*s,得去看看手册上怎么说的。
qiezi
2007-08-07
委托就是一个对象指针和一个函数指针的绑定,它本身就是2个指针的组合。
Colorful
2007-08-07
应你的要求,给出代码示例:
module sample;
import std.base64;
void main()
{
methodA();
methodB();
}
private void methodA()
{
auto a = "%%%abdsfds%";
printf("a string (%d):\t%*s\n", a.length, a);
auto b = encode(a);
printf("b string (%d):\t%*s\n", b.length, b);
auto c = decode(b);
printf("c string (%d):\t%*s\n", c.length, c);
assert( a == c);
}
private void methodB()
{
auto d = "%%%ABCCCC%AFDSFDS%" ~ "CCCCAAFDSFDSAAAAAA" ~"张33";
printf("d string (%d):\t%*s\n", d.length, d);
char[] e = new char[encodeLength(d.length)];
encode(d, e);
printf("e string (%d):\t%*s\n", e.length, e);
char[] f = new char[decodeLength(e.length)];
decode(e, f);
printf("f string (%d):\t%*s\n", f.length, f);
//这里之所以会出现断言错误,是因为两个字符串的长度不一致
//assert( d == f);
//下面这段代码可以说明问题
assert( d.length != f.length );
//修正该问题
f.length = f.length -1;
assert(d == f);
}
Colorful
2007-08-07
D语言毕竟是新生语言,而且只有Walter在开发编译器,要想跟C#一样,几年之间就能火遍全球,困难极大。Microsoft有足够的人手来开发,优化编译器,而且有MSDN和一大批知名技术作家来推广。
D只能靠社区来推动。
如果你有C,C++,C#,Java等语言的经验,理解D语言当然事半功倍。
相信肯定学习过C/C++吧,C#跟Delphi,Java,C++,C都有着千丝万缕的关系。
delegate其实就是成员指针,跟函数指针很类似。
其实D可以只有delegate的。
目前最佳的资料就是D语言规范。
http://www.digitalmars.com/d/
D只能靠社区来推动。
如果你有C,C++,C#,Java等语言的经验,理解D语言当然事半功倍。
相信肯定学习过C/C++吧,C#跟Delphi,Java,C++,C都有着千丝万缕的关系。
delegate其实就是成员指针,跟函数指针很类似。
其实D可以只有delegate的。
目前最佳的资料就是D语言规范。
http://www.digitalmars.com/d/
sofire
2007-08-07
D语言的例子真少。想看一个语法是怎么回事,都找不到。
尤其是帮助文档中的例子。少得我都不知道应该怎么用。
比如delegate,以前一点概念都没有。
感觉和函数指针一个东西。
例子也不多,理解起来真困难。
是不是要学D语言,得先去学习C,C++,C#,java,python。
然后再像作者那样,学习编译原理,才能理解D语言是啥东西。
尤其是帮助文档中的例子。少得我都不知道应该怎么用。
比如delegate,以前一点概念都没有。
感觉和函数指针一个东西。
例子也不多,理解起来真困难。
是不是要学D语言,得先去学习C,C++,C#,java,python。
然后再像作者那样,学习编译原理,才能理解D语言是啥东西。
Colorful
2007-08-06
D语言其实也很无奈,C#没有静态数组的困扰,呵呵。
主要还是Native和VM有着不少区别。
主要还是Native和VM有着不少区别。
oldrev
2007-08-06
D 中的数组确实难理解,应该是相当于C++中的
说它是引用类型吧,又跟类的引用不完全是一回事,类的引用其实只是一个指针,而D数组引用的类型实际是 Array 的值类型,通过内部的 ptr 指向真正的数据。在这方面,D应该向C#学习,把 T[] 映射到标准库的类就能解决这个不一致的问题了。
struct Array {
size_t length;
T* ptr;
};
说它是引用类型吧,又跟类的引用不完全是一回事,类的引用其实只是一个指针,而D数组引用的类型实际是 Array 的值类型,通过内部的 ptr 指向真正的数据。在这方面,D应该向C#学习,把 T[] 映射到标准库的类就能解决这个不一致的问题了。
Colorful
2007-08-06
我只能说这个不能在D 2.0中编译,呵呵。
希望好好了解一下数组,字符串,以及char[],string,还有invariant,const,final修饰的区别。
除了D语言规范的文档,可以看一下几篇文章:
http://colorful1982.blog.sohu.com/46495851.html
http://oldrev.javaeye.com/blog/105074
希望好好了解一下数组,字符串,以及char[],string,还有invariant,const,final修饰的区别。
除了D语言规范的文档,可以看一下几篇文章:
http://colorful1982.blog.sohu.com/46495851.html
http://oldrev.javaeye.com/blog/105074
发表评论
- 浏览: 14937 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
最新评论
-
Dmd编译器学习笔记
我看了 一些D语言的一些介绍,对于的产生还是有的疑惑.
-- by zhangtianfeng -
Dmd编译器学习笔记
.so文件是用-L来指定的,比如gcc的-levent是用来链接libevent ...
-- by qiezi -
Ddoc文档注释学习笔记
...
-- by tomqyp -
Ddoc文档注释学习笔记
转换成其他语言?是说用汉字吗?
-- by sofire -
Ddoc文档注释学习笔记
Good work. 不知道上面的定义的节名能不能自动转换成其他语言,我估计很 ...
-- by Colorful






评论排行榜