GetMem(charArr, decryptedDataLen); // charArr: PChar; fileStream.Clear;
fileStream.WriteBuffer(encryptData, decryptedDataLen); // encryptData: array of Byte;里边保存的是97, 0, 98,0,99,0
fileStream.Position := 0;
fileStream.ReadBuffer(charArr, fileStream.Size); // 读完之后,charArr中已经是'abcұ篘㖄ꉱë딘Bུ'
s := string(charArr);
ShowMessage(s);
是什么原因呢?请有经验的朋友指点一下,谢谢先了
解决方案 »
- DBGrid行数问题请教
- 关于(ldsmtp)的发送邮件问题
- 在控制面版里卸载程序的问题
- 如何让程序中的某个过程,在某些时间段只运行一次?
- 大家随便说说
- GLXtreem哪里下载?
- 请问大家:DBNavigator的使用,当连接上datesourse时,按扭怎么变成灰色,运行后还是灰色
- 怎么让Html文件在Form中显示(要求不显示IE的菜单)?
- delphi中indy的idTCPServer问题,求助
- 讨论一下怎么实现管理中多对多的关系。
- delphi2010里,怎样把TMemoryStream中的字符倒到string中?
- RvDataSetConnection1和RvProject1做随查询结果更新的报表
fileStream.ReadBuffer(charArr, fileStream.Size);
charArr:array of char;
charArr是PChar类型啊,不能用这个SetLength。
fileStream.WriteBuffer(encryptData, decryptedDataLen); // encryptData: array of Byte;里边保存的是97, 0, 98,0,99,0
fileStream.Position := 0;
//改下面这句话
fileStream.ReadBuffer(charArr^, fileStream.Size); // 读完之后,charArr中已经是'abcұ篘㖄ꉱë딘Bུ'
s := string(charArr);
ShowMessage(s);
fileStream.Clear;
fileStream.WriteBuffer(encryptData, decryptedDataLen);
fileStream.Position := 0;
SetLength(charArr, fileStream.Size + 1);
fileStream.ReadBuffer(charArr, fileStream.Size);
for i := 0 to High(charArr) do
s := s + charArr[i]; // 这里出现内存访问违规了 ShowMessage(s);但是出现内存访问违规。
这样声明的。
很奇怪,流的操作不是基于字节的吗?2010里应该是Char = 2字节,我用了charArr: array of Char,那个流写入应该如实写入就行了,但是会这样显示('a', 'b', 'c', '', '烥', '柣'),正常来说应该是显示('a', 'b', 'c')就行了吧?因为两个字节并成了一个字节了,怎么会这样呢?
fileStream.Write( encryptData[0], Length(encryptData) );
这里的encryptData是动态数组,动态数组的第一个元素就是encryptData[0],而不是encryptData自身,因为delphi中实现动态数组和string是相似的,都有引用计数(生存期自管理)。这个问题明晰后,再看把动态数组中的字符编码(内码)直接Move入2010的UnicodeString(默认)是怎样的写法:Move( ucsStr[1], charCode[0], Length(charCode) );实践证明ucsStr的结果就是这个内码代表的Unicode字符串!!注:Move是Stream.ReadBuffer、WriteBuffer的最终实现者了。以上结论是通过多次实验得到的,希望对后来者有一定提示,我也是通过楼上诸位的讨论受到的启发,真的非常感谢这几位了!
Move真的很好用,但一定得熟悉delphi的各种数据结构,特别是数组、动态数组、字符串。