`
sofire
  • 浏览: 146157 次
  • 性别: 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

相关推荐

    BASE64——Delphi程序

    在Delphi7中,虽然没有内置的BASE64函数,但开发者可以利用汇编语言编写高效的算法来实现这一功能。汇编语言的使用可以更直接地操控计算机硬件,从而在某些情况下提高程序执行速度。对于那些对性能有极高要求的应用...

    pb9_base64_pb调用base64.dll_PB9base64_Base64.dll_glass8y6_pbbase64

    通过对base64.pbl、base64.pbt和base64.pbw文件的研究,我们可以了解到如何在PB9中自定义实现Base64编码,并学习到如何在PB项目中组织和管理代码。这对于需要在PowerBuilder环境中处理二进制数据的开发者来说,是一...

    labview 图片缩放 base64编码base64解码

    首先,你需要将图像数据转换为字节串,然后使用Base64编码函数将字节串转换为可读的字符串。这样,图片数据就可以以文本形式在网络上传输,或保存在文本文件中。 3. **Base64解码**: 当接收到Base64编码的字符串...

    VB JPG转base64和base64转JPG.rar

    通过学习和理解这些代码,开发者不仅可以掌握Base64编码的基础知识,还能了解到VB6.0处理文件和字符串的方法,这对于进行类似的数据传输和存储工作大有裨益。 总之,Base64编码是IT行业中一个重要的概念,尤其在...

    base64加密解密程序 v1.0

    总的来说,“base64加密解密程序 v1.0”是一个简单的教学工具,有助于理解Base64编码和解码的过程。对于初学者来说,通过阅读和修改这个HTML文件,可以深入学习JavaScript编程、数据编码以及Web前端交互设计。同时,...

    Inno Setup Base64编码解码函数

    在IT领域,尤其是在软件...通过分析`Base64DecodeEncode.iss`文件,我们可以学习如何在Inno Setup脚本中实现这一功能,以满足项目需求。对于熟悉Pascal Script的开发者来说,这是一种强大的扩展Inno Setup功能的方式。

    pb base64加解密动态库

    2. base64api.cpp:这个文件定义了对外的API接口,即PowerBuilder可以调用的函数,以便在PB程序中调用Base64库进行加解密操作。通常会包括如`Base64Encode`和`Base64Decode`这样的函数。 3. StdAfx.cpp:这是一个预...

    Base64转图片

    包含的两个文件"BASE64_TO_IMAGE.exe"是实际的执行程序,用户可以直接运行进行Base64和图片的转换操作;"1.png"可能是示例图片或用于演示如何使用该工具的说明图。 总的来说,"Base64转图片"工具利用MFC提供的功能...

    base64编解码C/C++实现

    9. **使用示例**:在`base64.cpp`和`base64.h`中提供的`main`函数可能是演示如何使用这两个函数的例子,可以通过它了解如何在C++程序中调用这些编解码方法。 10. **API设计**:`base64.h`文件通常会定义接口,如`...

    C实现将BMP文件转base64编码

    你可以通过查看和运行这个程序来学习具体的实现细节,包括文件操作、二进制数据处理和Base64编码的算法。这个项目对于学习图像处理、文件操作和编码技术都是很好的实践,同时也加深了对C/C++编程的理解。

    基于Linux 图像与BASE64编码互转.zip

    6. **程序实现**:`PicToBase64`可能是一个C++或C编写的程序,它利用上述技术读取图像文件,将其转换为BASE64字符串,同时也能接收一个BASE64字符串并将其解码回图像文件。程序可能包括以下步骤: - 读取图像文件。...

    易语言BASE64编码模块

    例如,你可能需要学习如何将一个字符串转换为二进制,然后使用`BASE64编码`函数将其编码为BASE64字符串,再将接收到的BASE64字符串解码回原始二进制数据。 `content.txt`可能是这个模块的详细文档或示例代码,它能...

    base64.rar

    base64.h头文件则可能定义了这些函数的接口,供其他C++程序调用。通常,头文件会包含函数原型声明、常量定义和其他必要的类型定义。 Base64编码在很多场景下都有应用,例如: - 在电子邮件中,由于SMTP协议只支持...

    Delphi Base64 加密解密源码

    通过分析和学习这个示例代码,你可以更深入地理解Base64在Delphi中的实际应用。 总的来说,掌握Delphi中的Base64加密解密不仅能够帮助你在数据传输和存储时确保数据的安全,还能够提升你在网络编程和数据处理方面的...

    base64编码解码程序

    Base64是一种在互联网上广泛...通过分析和理解"base64.cpp"源代码,我们可以学习到如何在C++中实现Base64编码和解码的细节,这将有助于理解底层数据处理和字符编码原理,对于网络通信、数据存储等领域的工作非常有用。

    易语言Base64编解码新汇编源码

    易语言Base64编解码新...总之,易语言Base64编解码新汇编源码是一个实用的工具,它结合了易语言的特性,帮助开发者处理二进制数据的编码和解码问题,对于理解Base64工作原理以及易语言编程实践都具有很高的学习价值。

    android jni base64 和java base64 通用

    通过分析和学习这些代码,你可以更好地理解如何在Android应用中使用JNI实现跨平台的Base64操作,并确保与Java的Base64库兼容。 总之,本主题涉及了Android应用开发中的JNI技术,如何在C/C++中实现Base64编码和解码...

    base64编码程序

    通常,一个C语言的Base64编码程序会包含一个主函数,负责读取输入文件、调用编码函数,并将结果写入输出文件。编码函数则会包含一个循环,遍历输入数据并进行Base64转换。 理解这个程序的工作原理有助于你进行修改...

    base64编码解码易语言

    例如,可能有一个名为"base64编码"的函数,用于将字符串或二进制数据转换成Base64格式的字符串;另一个名为"base64解码"的函数,则用于将Base64编码的字符串还原为原始的二进制数据。 在提供的压缩包文件"base64.e...

    图片Base64编码后存为文本,delphi程序源码

    Delphi的标准库中并没有内置的Base64编码函数,但你可以使用第三方库,如Indy或Synapse,它们提供了Base64编码的接口。或者,你可以自定义一个函数,利用字符串操作来实现Base64编码算法。 4. **保存为文本**:编码...

Global site tag (gtag.js) - Google Analytics