`
sofire
  • 浏览: 143979 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

差别不一定是1,我把encode/decode函数理解错误了。
在文章最后有一些测试结果。
8 楼 sofire 2007-08-07  
谢谢 Colorful!
原来可以用 %*s 来打印,我看例子上是写的%.*s,得去看看手册上怎么说的。
7 楼 qiezi 2007-08-07  
委托就是一个对象指针和一个函数指针的绑定,它本身就是2个指针的组合。
6 楼 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);
}
5 楼 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/
4 楼 sofire 2007-08-07  
D语言的例子真少。想看一个语法是怎么回事,都找不到。
尤其是帮助文档中的例子。少得我都不知道应该怎么用。
比如delegate,以前一点概念都没有。
感觉和函数指针一个东西。
例子也不多,理解起来真困难。
是不是要学D语言,得先去学习C,C++,C#,java,python。
然后再像作者那样,学习编译原理,才能理解D语言是啥东西。
3 楼 Colorful 2007-08-06  
D语言其实也很无奈,C#没有静态数组的困扰,呵呵。
主要还是Native和VM有着不少区别。
2 楼 oldrev 2007-08-06  
D 中的数组确实难理解,应该是相当于C++中的
struct Array {
  size_t length;
  T* ptr;
};


说它是引用类型吧,又跟类的引用不完全是一回事,类的引用其实只是一个指针,而D数组引用的类型实际是 Array 的值类型,通过内部的 ptr 指向真正的数据。在这方面,D应该向C#学习,把 T[] 映射到标准库的类就能解决这个不一致的问题了。
1 楼 Colorful 2007-08-06  
我只能说这个不能在D 2.0中编译,呵呵。
希望好好了解一下数组,字符串,以及char[],string,还有invariant,const,final修饰的区别。

除了D语言规范的文档,可以看一下几篇文章:
http://colorful1982.blog.sohu.com/46495851.html
http://oldrev.iteye.com/blog/105074

相关推荐

    fetch-base64:一个节点程序包,以base64编码获取本地或远程文件

    取得Base64 一个节点程序包,用于以base64编码获取本地或远程文件。 用于将资产(图像,Web字体等)内联到HTML或CSS文档中。 免责声明:到目前为止,我仅将其用于图像,但没有理由为什么它不适用于任何其他类型的...

    QQ登录器C++源代码(BCB2007)(含MD5算法及BASE64编码解码的C源代码)

    MD5Class: 完整的MD5码生成类和Base64编码解码函数. Tmqlgn.cfg: 保存QQ登录命令行(经过加密处理) 声明: 程序中的MD5算法和BASE64编码算法均来自互联网,经适当的改编封装而成,未经原作者许可, 请勿用于商业目的. ...

    C++编写计算三角形、正方形和圆形面积程序

    抽象出一个基类Base,在其中说明一个虚函数,用来求面积,并利用但界面和多定义版本设计求各个图形面积的方法。 了解虚函数对多态性的支持。 掌握虚函数和纯虚函数的概念。 理解静态多态性和动态多态性,学习使用虚...

    IDA pro逆向工具的使用以及逆向分析程序实例操作

    3.加密编码算法 包括base64变表编码和简单异或加密解密案例并带有加解密源码 4.动态调试 包括动态调试解密案例 5.脱壳处理 包括解压壳脱壳解密案例 6.附带4个解密案例程序,包括三个exe文件和一个linux程序的逆向...

    Excel公式与函数大辞典.宋翔(带书签高清文字版).pdf

    本书采用理论与实践相结合的方式,提供了457 个案例,涉及多个行业,读者可以根据书中的案例举一反三,将其直接应用到实际工作中,有效提高学习效果与实际应用能力。 本书既可以作为函数速查工具手册,又可以作为...

    Visual C# 2010程序设计教程(教程PPT+源代码)

    通过本书的学习,读者可以逐步掌握C#程序设计。  本书难度适中,实例丰富,可操作性强,可作为高等学校计算机相关专业的教材或参考用书,也可供广大程序员参考。 目录 第1章.NET平台与Visual Studio开发工具 1.1...

    windows 程序设计

    主要的区别在于C语言链接库函数的机械码连结到您的程序代码中,而Windows函数的程序代码在您程序执行文件外的DLL中。 当您执行Windows程序时,它通过一个称作「动态链接」的过程与Windows相接。一个Windows的.EXE...

    intel oneapi base toolkit and hpc toolkit 2022.2

    英特尔对oneAPI的实现包括很多其他库、编译器和分析器,它被安排在特定的应用程序领域的工具套件中,可以通过多种方式下载或者在英特尔DevCloud上远程使用。在英特尔oneAPI里可以找到入门所需要的一切,里面涵盖了...

    网狐6.6 服务器源代码 & 共享组件 & 数据库 (2)

    包括服务器端所有组件(内核除外,现在市面上还没有6.6内核),共享组件(公共服务,界面控件,界面资源),以及全部数据库文件和脚本文件,6.6较6.5有较大改动,是学习研究的上等程序代码。 结合本人上次发布的...

    PHP程序开发范例宝典III

     《PHP程序开发范例宝典》内容充实,实例丰富,特别适于PHP编程人员和广大计算机爱好者学习开发使用,也可供大、中专院校师生阅读 参考。  《PHP程序开发范例宝典》附有配套光盘。光盘提供了书中所有实例的源...

    VB加密算法代码集锦.rar

    比如Huffman、LZSS、LZW、RLE、Aritmatic、LBE、Base64等等.... qcryptoCLS.ZIP: VB MD5安全模块示例 SECUREencryptionalgorithms.zip: 这个加解密源码几乎包括了世界上几个最著名的加密算法:Blowfish、...

    intel oneapi base toolkit and hpc toolkit 2022.2 分卷2

    英特尔对oneAPI的实现包括很多其他库、编译器和分析器,它被安排在特定的应用程序领域的工具套件中,可以通过多种方式下载或者在英特尔DevCloud上远程使用。在英特尔oneAPI里可以找到入门所需要的一切,里面涵盖了...

    廖雪峰python3 完整带索引,图片 最新教程 pdf版

    base64 struct hashlib hmac itertools contextlib urllib XML HTMLParser 常用第三方模块 Pillow requests chardet psutil virtualenv 图形界面 网络编程 TCP/IP简介 TCP编程 UDP编程 电子邮件 SMTP发送邮件 POP3...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    一、Qt Creator 的安装和hello world 程序的编写(原创) 1.首先到Qt 的官方网站上下载Qt Creator,这里我们下载windows 版的。 下载地址:http://qt.nokia.com/downloads 如下图我们下载:Download Qt SDK for ...

    基于Serverless图像转换为宫崎骏动漫风格案例python源码+项目说明.zip

    return base64.b64encode(data.tostring()).decode('utf8') def getResult(imagePath): data = json.dumps({'images': [cv2_to_base64(cv2.imread(imagePath))]}) r = requests.post(...

    从重力模拟到元胞自动机的不同算法和模拟,在 python 中实现_python代码_下载

    用 Python 编写的所有模拟和算法的库。包括从太阳系和重力模拟到排序算法可视化器的程序。所有算法和模拟都是由 Fraser ...ASCII 到 Base64 编码器和解码器 MD5 哈希生成器 霍夫曼编码压缩和解压缩 根的多项式构造函数

    C++程序设计_中型项目 游戏"双人大战"的控制台实现.pdf

    本次实验旨在主要对前期学习的有关C++面向对象部分的多态性知识进行实践操作,并综合前期的全部有关面向对象的内容,完成项目。 在理论方面主要体现了: 1.面向对象的抽象思维分析; 2.对继承关系的分析和实践应用; 3....

    C++上机实验报告-实验五.docx

    编写程序定义一个基类BaseClass,构造其派生类DerivedClass,在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。程序名:lab7_2.cpp。 3.用debug功能跟踪程序lab7_2的执行过程,观察...

    vld(Visual Leak Detector 内存泄露检测工具 源码)

    LPSTACKFRAME64 StackFrame, PVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE64 ...

Global site tag (gtag.js) - Google Analytics