不可思议的console.writeline()怪现象,谁能解释?

jo_say 2010-06-17 07:53:38
今天把一个以前c下的des算法给封装成dll,然后再c#中调用,一切都很正常。但是刚才吃饭的时候,突然一时兴起,想测试一下加密密文长度稍微大点时,dll能否正常运行,就在此时一个奇怪的现象发生了。如下图:

红圈圈中的密文被console.writeline给显示出来时,居然在最后面显示了我的一些文件的路径,(这里显示的是我的cxf开发包下的一个jar文件,这个路径从何而来??为什么能够显示出来呢??是什么原因,呵呵。
更奇怪的是,原来我的输出语句是:
Console.WriteLine("\n密文:");
Console.WriteLine(buf1); 它显示的结果是上图,但是我把这两个给组合起来后,
Console.WriteLine("密文:"+buf1.ToString());
居然显示又发生了变化,见图2:

family?? whats this ?? 到底是什么的原因,我又在
Console.WriteLine("密文:"+buf1.ToString());
的密文两字前面加了个换行,居然又变成了第一幅图。换行到底在这里起到了什么作用??

我想这和缓冲区应该有关系吧,不过c#的console应该是代码安全的啊,怎么能出现这种情况?

【如果谁需要,我可以提供dll和测试例程】

...全文
1094 36 点赞 打赏 收藏 举报
写回复
36 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
波导终结者 2010-06-21
你的字符串有/0结束符没?
  • 打赏
  • 举报
回复
wjq 2010-06-21
我认为是C封的dll里的问题,密文byte数组长度没搞对,多复制了一些内存中的数据出来,c#转为string时,一起转换了,所以会复制出一些和你本机有关的但随机的内容出来。
  • 打赏
  • 举报
回复
arong1234 2010-06-21
感觉C++中得char*和C#中得string不是一个东西,由于这个原因,其在C#中得输出带有一点不确定性。例如:你得密文也不对,开头几个字节就和代码中得不一样。

解决这个问题得办法也是要把这种不一致性解决掉。但是我对C#和C++之间得互相操作该怎么搞,所以帮不了你。建议用managed C++写,这样可以确保String在两种语言中都可以用
  • 打赏
  • 举报
回复
coder_s 2010-06-21
[Quote=引用 34 楼 wjq 的回复:]

我认为是C封的dll里的问题,密文byte数组长度没搞对,多复制了一些内存中的数据出来,c#转为string时,一起转换了,所以会复制出一些和你本机有关的但随机的内容出来。
[/Quote]
有可能 +1
  • 打赏
  • 举报
回复
Csdbfans 2010-06-20
顶起,闪人
  • 打赏
  • 举报
回复
siegebaoniu 2010-06-20
关注,的确蛮奇怪的。
  • 打赏
  • 举报
回复
jo_say 2010-06-20

void main()
{



char key[]={0,2,0,0,9,3,5,1,9,8,0,0,9,1,7}, buf[255];
char str[]="发阿斯顿发发射点发送方的阿斯发送方的阿斯顿发射点发送方的";


memset(buf,0,sizeof(buf));
puts(buf);
puts("\n **");
strcpy(buf,str);
puts("\n PlainText");
puts(buf);

int s=sizeof(str);
printf("\n %d \n",s);

Des_Go(buf,sizeof(str),key,sizeof(key),0);
puts("\n After encryption:");
puts(buf);

Des_Go(buf,sizeof(str),key,sizeof(key),1);
puts("\n Recove:");
puts(buf);

getchar(); //使窗口暂停
}
  • 打赏
  • 举报
回复
jo_say 2010-06-20
[Quote=引用 30 楼 soaringbird 的回复:]
把你的函数声明贴出来即可
[/Quote]

c#下调用时的声明:
class CallDll
{
[DllImport("desDLl.dll", CharSet = CharSet.Unicode)]//, EntryPoint="Des_GO")
public static extern int Des_Go(StringBuilder sout, int datalen, string key, int type);
}


原来在c下的声明以及函数源码:【我已把key的length的第4个参数给去掉了,直接在函数第一句中取,为什么不去掉datalen呢,因为之间在原作者的测试代码中,它的datalen取的值不是直接对strlen(Out)求长度,等会我贴出c下的测试代码。

EXPORT bool Des_Go(char *Out,long datalen, const char *Key, int Type)
{

int keylen=strlen(Key); //不用再输入

char *In=Out; // qiao Add

if( !( Out && In && Key && (datalen=(datalen+7)&0xfffffff8) ) )
return false;
SetKey(Key, keylen);
if( !Is3DES ) { // 1次DES
for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8)
DES(Out, In, &SubKey[0], Type);
} else{ // 3次DES 加密:加(key0)-解(key1)-加(key0) 解密::解(key0)-加(key1)-解(key0)
for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8) {
DES(Out, In, &SubKey[0], Type);
DES(Out, Out, &SubKey[1], !Type);
DES(Out, Out, &SubKey[0], Type);
}
}
return true;
}
  • 打赏
  • 举报
回复
soaringbird 2010-06-20
把你的函数声明贴出来即可
  • 打赏
  • 举报
回复
jo_say 2010-06-20
我可把所有相关代码都发给你 你可以测试一下 给我一个email即可 发到这里或者空间消息里都可[Quote=引用 25 楼 soaringbird 的回复:]
引用 21 楼 jo_say 的回复:

引用 20 楼 soaringbird 的回复:
引用 18 楼 jo_say 的回复:

还有就是,这里如果charset不用unicode,就会有末尾的部分数据没有别加密,用unicode就没有问题,如果数据少一点,是不会出现上面的那些莫名其妙的现象的 ,呵呵

都混到一起了,里不清楚了。。到底是 what reason?? 怎么才能避免……
[/Quote]
  • 打赏
  • 举报
回复
jo_say 2010-06-20
你图像上美女 我要是能碰见一个就好了[Quote=引用 23 楼 siegebaoniu 的回复:]
关注,的确蛮奇怪的。
[/Quote]
  • 打赏
  • 举报
回复
jo_say 2010-06-20
今天我到实验室把
StringBuilder buf1 = new StringBuilder(255);
中的255变得大一点 结果就没有显示那个莫名其妙的东西了
晚上回来用自己的电脑 还是不行 呵呵

还有:楼上urhp02857我已把代码 dll生成代码 和c下的源码和测试代码都发给你了 c下调用这个是没有问题的 。你再比较比较 我做了测试 穿个函数的参数在c#下和c下都是一致的了 就是结果显示。。。

谁还有的话 去我资源下 名字就是:des源码及c和c#下的调用示例
说明:
里面有 3个项目:
1。 WjcDes2是原始的一个win32 命令行程序,别人的 ,我在它基础上改进成dll的。
2。 desDll项目就是我改进的win32 dll项目,通过它生成需要调用的dll
3。 tryUseQiaoDesDll就是用c#调用这个dll的代码。
  • 打赏
  • 举报
回复
盜令玊 2010-06-20
[Quote=引用楼主 jo_say 的回复:]
【如果谁需要,我可以提供dll和测试例程】
[/Quote]
发我一份 wangdj@allytel.com.cn
  • 打赏
  • 举报
回复
ycg_893 2010-06-20
你先把它输到字符窜,看看字符窜就知道了
  • 打赏
  • 举报
回复
soaringbird 2010-06-20
[Quote=引用 21 楼 jo_say 的回复:]

引用 20 楼 soaringbird 的回复:
引用 18 楼 jo_say 的回复:

还有就是,这里如果charset不用unicode,就会有末尾的部分数据没有别加密,用unicode就没有问题,如果数据少一点,是不会出现上面的那些莫名其妙的现象的 ,呵呵

都混到一起了,里不清楚了。。到底是 what reason?? 怎么才能避免。

最奇怪的是, 我的两个consol……
[/Quote]
你给buf1分配了比如100字节的空间,dll往buf1里填充了80字节的内容,剩下的20字节并不是0,而是原先是什么就是什么,所以这类的dll往往同时有个输出参数返回填充的内容的长度
  • 打赏
  • 举报
回复
vip__888 2010-06-19

精神可嘉。。话说 你又是马甲?
  • 打赏
  • 举报
回复
回明狂客 2010-06-19
我无语了,看不懂!
  • 打赏
  • 举报
回复
jo_say 2010-06-19
dll返回的只是密文 如果它有问题,就肯定会影响解密结果,而这里解密结果没有问题,几乎可以推测dll没有问题。关键奇怪的是,你可以看到上面两个图,我变化的只是console的输出内容(只是少了一个\n),居然发生了结果变化。这难道不是它的问题么??

[Quote=引用 4 楼 cgabriel 的回复:]
引用楼主 jo_say 的回复:
今天把一个以前c下的des算法给封装成dll,然后再c#中调用,一切都很正常。但是刚才吃饭的时候,突然一时兴起,想测试一下加密密文长度稍微大点时,dll能否正常运行,就在此时一个奇怪的现象发生了。如下图:

红圈圈中的密文被console.writeline给显示出来时,居然在最后面显示了我的一些文件的路径,(这里显示的是我的cxf开发包下的一个jar文件,……
[/Quote]
  • 打赏
  • 举报
回复
jo_say 2010-06-19
[Quote=引用 20 楼 soaringbird 的回复:]
引用 18 楼 jo_say 的回复:

还有就是,这里如果charset不用unicode,就会有末尾的部分数据没有别加密,用unicode就没有问题,如果数据少一点,是不会出现上面的那些莫名其妙的现象的 ,呵呵

都混到一起了,里不清楚了。。到底是 what reason?? 怎么才能避免。

最奇怪的是, 我的两个console本质上显示上是不会有区别,抛弃整个显示内容的背景,就……
[/Quote]但是直接输出buf也有问题 不过你倒是提醒我了 难道是stringbuilder自动添加成为255的倍数的多余字节的原因。。。我试试。
  • 打赏
  • 举报
回复
soaringbird 2010-06-19
[Quote=引用 18 楼 jo_say 的回复:]

还有就是,这里如果charset不用unicode,就会有末尾的部分数据没有别加密,用unicode就没有问题,如果数据少一点,是不会出现上面的那些莫名其妙的现象的 ,呵呵

都混到一起了,里不清楚了。。到底是 what reason?? 怎么才能避免。

最奇怪的是, 我的两个console本质上显示上是不会有区别,抛弃整个显示内容的背景,就相当于 一个buf参数直接输出和 tostr……
[/Quote]
buf1.ToString,没有限定长度,越界了
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
C#
加入

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2010-06-17 07:53
社区公告

让您成为最强悍的C#开发者