2007-08-06

base64函数的学习程序

关键字: D语言 base64
import 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
评论
Colorful 2007-08-07
差别当然不是1,呵呵.
我那个,只是为了说明问题采用的临时解决方案。
Colorful 2007-08-07
客气了,互相学习.
我采用%*s来打印输出,主要是使用了printf函数.
writefln函数不存在这个问题.
sofire 2007-08-07
//修正该问题
f.length = f.length -1;
assert(d == f);

差别不一定是1,我把encode/decode函数理解错误了。
在文章最后有一些测试结果。
sofire 2007-08-07
谢谢 Colorful!
原来可以用 %*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/
sofire 2007-08-07
D语言的例子真少。想看一个语法是怎么回事,都找不到。
尤其是帮助文档中的例子。少得我都不知道应该怎么用。
比如delegate,以前一点概念都没有。
感觉和函数指针一个东西。
例子也不多,理解起来真困难。
是不是要学D语言,得先去学习C,C++,C#,java,python。
然后再像作者那样,学习编译原理,才能理解D语言是啥东西。
Colorful 2007-08-06
D语言其实也很无奈,C#没有静态数组的困扰,呵呵。
主要还是Native和VM有着不少区别。
oldrev 2007-08-06
D 中的数组确实难理解,应该是相当于C++中的
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
发表评论

您还没有登录,请登录后发表评论

sofire
搜索本博客
最近加入圈子
存档
最新评论
评论排行榜