#ant

The dreams in which I'm dying are the best I've ever had...

共2页: 1 2 
re: strlen源码剖析 蚂蚁终结者 2008-09-07 19:54
@star
欢迎转载,转载当然是没有问题的,毕竟写文章就是能让更多的人看到!

为什么不一次就移32位呢?
我也不太清楚,可能就其中注释所说:
/* Do the shift in two steps to avoid a warning if long has 32 bits. */
只是为了避免warn吧呵呵!
re: MD5算法的C++实现 蚂蚁终结者 2008-09-01 19:38
@zhongyunde
代码没有问题,可以放心使用!
不错,有点意思。
re: MD5算法的C++实现 蚂蚁终结者 2008-08-19 10:12
@zhengdu
你用的是哪个版本的VC ?VC6.0 ?

大概是你的编译器太老,不支持static const整形值的初始化语法,试试下面两种办法:

1. 将md5.h中的
static const size_t BUFFER_SIZE = 1024;
改为
enum { BUFFER_SIZE = 1024 };

2. 将md5.h中的
static const size_t BUFFER_SIZE = 1024;
改为
static const size_t BUFFER_SIZE;

并在md5.cpp的
MD5::MD5() {
reset();
}
上面加上
const size_t MD5::BUFFER_SIZE = 1024;
re: MD5算法的C++实现 蚂蚁终结者 2008-06-23 22:03
@CPPLearning
谢谢提醒,是我的疏忽呵呵!
re: 非完美C++ Singleton实现[2] 蚂蚁终结者 2008-05-06 22:02
@sodar
能说下在动态库工程中使用Singleton的具体需求吗?dll中用atexit注册的函数在FreeLibrary的时候会被调用,可以保证Singleton安全析构。
作为库函数效率还是比简洁重要,建议看下VC CRT的汇编代码。
很不错,能不能帮忙发个源代码,非常感谢!!!
antterminator@gmail.com
re: MD5算法的C++实现 蚂蚁终结者 2008-03-14 09:14
@gg
其实具体的用法在源代码的main函数中已经演示得很清楚了,我想你也肯定没有看文章后面的:“2.计算文件的MD5值”这一段,专门计算md5值的软件如WinMD5是以二进制形式打开文件的,所以:

string s1 = MD5(ifstream("file")).toString();
string s2 = MD5(ifstream("file", ios::binary)).toString();

s1与s2是不一样的,前一个是以文本模式打开,后一个是以二进制模式打开。
貌试很不错的IDE,哪天下载个玩玩!
re: 单件模式的实现 蚂蚁终结者 2008-03-02 21:37
singleton远没有想象的那么简单!
re: C++&Win32写的空当接龙 蚂蚁终结者 2008-02-24 15:24
呵呵,源代码在上面就有下载啊!
re: boost::static_assert 蚂蚁终结者 2008-01-05 21:26
不错,虽然没用过。却值的学习
re: 对07年的总结,对08年的期望 蚂蚁终结者 2008-01-01 15:47
不错,真心支持。祝早日写出一套engine
re: 反外挂的一点牢骚 蚂蚁终结者 2007-12-23 13:17
中国的外挂真是NB的不行了!
re: 程序的性能与语言选择 蚂蚁终结者 2007-12-13 10:49
不过说要混饭吃还是C/C++比较棒的
re: strlen源码剖析 蚂蚁终结者 2007-12-05 19:39
@福福
中文字符应该用wcslen才对,strlen是用来处理单字节字符串的。
详细描述请看MSDN:
However, strlen interprets the string as a single-byte character string, so its return value is always equal to the number of bytes, even if the string contains multibyte characters. wcslen is a wide-character version of strlen; the argument of wcslen is a wide-character string and the count of characters is in wide (two-byte) characters.
re: 关于sizeof()的简单解析 蚂蚁终结者 2007-11-15 10:51
以前也没有注意过,主要是不会这么写!
re: MD5算法的C++实现 蚂蚁终结者 2007-11-10 10:49
@MonkeyLin
thanks!
ICU记得以前编译Boost库时下载过。
在64位机器上确实会有问题,不过为了简单,也为了减少对库的依赖性,把
typedef unsigned long ulong;
改成
typedef unsigned int uint32;
基本就够用了。
已经更新了源代码^_^
re: strlen源码剖析 蚂蚁终结者 2007-11-04 09:35
you gotta it!
re: 自己动手编写的QQ客户端 蚂蚁终结者 2007-10-22 23:11
呵呵,前不久也打算写个玩玩,一直没时间
re: MD5算法的C++实现 蚂蚁终结者 2007-10-22 13:24
@MonkeyLin
都是学习嘛,互相讨论会更有收获呵呵。
re: “涨”声响起来,我心不明白 蚂蚁终结者 2007-10-18 19:24
呵呵,有意思。什么都涨价真是抗不住了。
这文章要是被党看见了可就要被
“和谐”
了。#_#
re: 做笔试题增长功力(3)--华为 蚂蚁终结者 2007-10-18 19:22
华为的笔试题貌似不难么,呵呵
re: 无符号变量居然也能输出-1 蚂蚁终结者 2007-10-18 12:44
呵呵,过来改正个笔误,11111111居然写成了1111了...
re: 你也许不知道的#define用法 蚂蚁终结者 2007-10-18 11:21
#@x
倒没怎么见过
re: 汉语编程++ 蚂蚁终结者 2007-10-18 11:17
非把人累死不可,确实是无聊的东西
re: 无符号变量居然也能输出-1 蚂蚁终结者 2007-10-18 11:08
实际上就是有符号数转换中"符号位扩展"的问题。
short temp2 = temp1;
...
unsigned int temp6 = temp2;
先不管temp2的值是多少,上面就是short符号位扩展到int,然后再从int转unsigned int的问题。short是有符号类型,先进行符号位扩展(假设short为16位,int/unsigned int为32位)
1. short为正数,则最高位为0,当从16位扩展到32位int时,扩展的高16位用0填充,即将符号位0进行扩展,这样扩展后的32位整数和原来的整数值是一样的。
2. short为负数,则最高位为1,当从16位扩展到32位int时,扩展的高16位用1填充,即将符号位1进行扩展,这样扩展后的32位整数和原来的整数值是也是一样的。
即上面的代码等效于:
short temp2 = temp1;//temp2为-1(11111111 11111111)
...
int tempInt = temp2; //符号位扩展,tempInt也为-1(11111111 11111111 11111111 11111111)
unsigned int temp6 = tempInt;//将(11111111 11111111 11111111 11111111)解释为无符号
re: MD5算法的C++实现 蚂蚁终结者 2007-10-18 10:27
@MonkeyLin
thanks!不过我想你没有仔细看代码,string是按值返回的,不存在任何问题。
如果返回值类型是string&或string*,才会出现你说的返回局部变量的问题。
另外,return str;与return string(str);并无本质区别。
re: 如何写出专业的C头文件 蚂蚁终结者 2007-10-17 10:04
都是相当实用的,不错。
re: 转:字节对齐详解 蚂蚁终结者 2007-10-17 10:00
不错的文章。
re: C++/VC/Windows学习书籍之我见 蚂蚁终结者 2007-10-16 07:55
入门的书籍有一本叫C++ how to program什么的好像很不错,就是有点厚,大概1000多页吧。中等书籍C++ Primer不错,再就是Effective C++,More Effective C++, Exception C++, More Exception C++之类的。
C++标准库的当然少不了,讲STL入门的有The C++ Standard Library,还可以当参考书用。还有STL源码剖析等。。。不一一列举了,总之好书太多了呵呵
re: 中国年轻人最绝望的六大社会现状 蚂蚁终结者 2007-10-13 15:47
小心被和谐了,呵呵~
re: strlen源码剖析 蚂蚁终结者 2007-10-12 16:43
我也奇怪,就改了一下,再发布就变了。连日期都变了,郁闷。。。
re: 非完美C++ Singleton实现[2] 蚂蚁终结者 2007-10-10 09:06
@fr3@K
谢谢你的建议。
不能从static code中调用Instance()确实是一种限制。我想应该可以通过某种类似Boost::singleton中的技巧来确保static object(mutex)在Instance()之前初始化。有时间了再把这段内容补上。
re: 非完美C++ Singleton实现[2] 蚂蚁终结者 2007-10-09 16:32
其实后来觉得多数情况下eager initialization要优于lazy initialization。
如经典的Meyer's Singleton以及Boost::singleton
re: 非完美C++ Singleton实现[2] 蚂蚁终结者 2007-10-09 16:30
@fr3@K
实际上multithreading的问题不在于mutex这里,一个好的设计会在main函数真正启动后再调用Instance(),而这时候global object可以确保已经初始化,即在调用Instance()时可以保证mutex已经初始化。因此只要程序在真正进入main函数以前不调用Instance(),就不会有global instance的初始化问题。
re: DES算法及其在VC++6.0下的实现 蚂蚁终结者 2007-10-08 22:40
不错,比较详细,有时间再看。
re: 开源QQ协议库QQProtocol 蚂蚁终结者 2007-10-06 09:38
不错的东西,先收下了哈哈。。。
re: 在你的win32程序中播放flash 蚂蚁终结者 2007-09-30 07:33
不错,先收藏了,可能以后后用到
re: [转]一学期内表情的变化[图] 蚂蚁终结者 2007-09-27 11:37
有意思
re: 在HGE中播放FLASH(.swf) 蚂蚁终结者 2007-09-27 11:36
不错,先收下,也许哪天就用上了
re: strlen源码剖析 蚂蚁终结者 2007-09-27 11:16
c语言的版本不会有endian的问题,如果用汇编就需要注意了。
假设有4个连续的字节abcd,现在要找出其中的第一个0字节:
1. 在PowerPC这种big-endian的计算机上,将这4个字节读到寄存器中依然是
abcd,从左到右找到最左边的0字节就OK了。

2. 在X86这种little-endian的计算机上,将这4个字节读到寄存器中就会变成
dcba,这就需要从右到左找到最右边的0字节。

可以看出,上面VC的汇编实现是针对X86计算机的。
re: 处女座:避免陷入细节 蚂蚁终结者 2007-09-27 10:06
刚好我是处女座的,难道是在说我呵呵!
re: [原创]想买的几本书啊~~残念... 蚂蚁终结者 2007-09-27 10:05
英文原版图书在国内是在难买
re: strlen源码剖析 蚂蚁终结者 2007-09-27 09:35
Sorry,我不该用WORD这个单词。我说的WORD在这里表示计算机中的一个字长,不是一般为2个字节的WORD类型。
re: C++&Win32写的空当接龙 蚂蚁终结者 2007-09-27 09:13
AI算法不是我自己写的,用的是Freecell Solver的C代码。那个比较复杂,差不多有1W多行,为了方便我就封装成了AI.dll
re: strlen源码剖析 蚂蚁终结者 2007-09-27 09:06
实际上0~255都能检测出来的:
if (cp[0== 0)
    
return cp - str;
if (cp[1== 0)
    
return cp - str + 1;
if (cp[2== 0)
    
return cp - str + 2;
if (cp[3== 0)
    
return cp - str + 3;
如果上面的语句执行完还没有return,则会继续下一次循环,这样还是能检测到在if语句中漏掉的128~255,只不过效率上会有所损失。如果要检测0~255之间的字符,strlen_c比strlen_d要好。因为strlen_c只会漏掉这样的WORD:
    10000000 XXXXXXXX XXXXXXXX XXXXXXXX
re: 从for到foreach 蚂蚁终结者 2007-09-27 08:33
用for来处理container确实比较麻烦,有时候for语句还得折行。
估计新的特性可能还要等不少时间...
re: strlen源码剖析 蚂蚁终结者 2007-09-27 08:19
可能我说的不够清楚,看下面的例子:
                   b3      b2       b1       b0
               31------------------------------->0
     longword: 00001001 00011000 00000000 00001100
+  magic_bits: 01111110 11111110 11111110 11111111
          sum: 10001000 00010110 11111111 00001011
^   ~longword: 11110110 11100111 11111111 11110011
            a: 01111110 11110001 00000000 11111000
& ~magic_bits: 10000001 00000001 00000001 00000000
       result: 00000000 00000001 00000000 00000000
sum = longword + magic_bits;
a = sum ^ ~longword;
即用sum与longword逐位比较,如果有某个位相同,就说这个位在加法后未改变,这样在a中为1的位就是未改变的。
 
result = a & ~magic_bits;
得到未改变的hole位,从上例可以看出第16 bit这个hole加法后未改变,这样就检测出了0字节。
 
共2页: 1 2