首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

byte数组转换char指针有关问题

2012-06-03 
byte数组转换char指针问题1、定义:Bbuf: array of ByteffpB: TFileStreamppB: PCharsizeB:Integer2、读

byte数组转换char指针问题
1、定义:
Bbuf: array of Byte;
ffpB: TFileStream;
ppB: PChar;
sizeB:Integer;

2、读取二进制文件代码:
ffpB := TFileStream.Create(fileNameB,fmOpenRead);
ffpB.Position := 0;
sizeB := ffpB.Size;
SetLength(Bbuf,sizeB);
ffpB.ReadBuffer(Bbuf[0],sizeB);
ffpB.Free;

3、转换:
地址直接赋值:ppB :=@Bbuf; 测试后发现尾巴部分的二进制文件有变动

分析:
数组byte转换为char指针后,char不知道何时结束
这是我个人的看法。想知道大家有没有碰到这样的情况,如何分析,如何解决的。

我现在是调用了c编写的dll库,现在需要传递char指针到dll的函数,这个char指针就是读取的二进制文件。该工作有同事用c++builder已经实现了,和delphi是一样的方法,不一样的是,c++builder在传入值的时候,传入byte数组和长度,编译器不报错能执行出结果(dll函数原型是传入char指针和长度);而delphi环境不行,编译器提示需要转换为pchar(char指针),我转换后返回的函数结果不对。

在线等待解决办法。

[解决办法]
用Move函数就行了,这么简单的问题打这么多字。
什么叫不知char何时结束?getMem的时候直接把byte的长度用上,然后move一下。
[解决办法]
如果有的话,数组中的第一个0被当成了结束标记,否则访问PChar的时候就可能造成越界,出现AV异常。
[解决办法]
楼主用什么版本的Delphi?如果是D2009以前的版本,PChar=PAnsiChar,如果是D2009后的版本PChar=PWideChar,两者是不同的.所以如果是D2009后的版本,把C++ DLL接口函数的代码翻译过来的话应该改成PAnsiChar,比如:

procedure test(buf:PAnsiChar;len:Integer);.....

然后,象你上面的代码调用的时候这样:

test(PAnsiChar(@Bbuf[0]),length(Bbuf));

肯定没有问题.
[解决办法]
另外需要特别注意函数的调用约定,是cdecl还是stdcall
[解决办法]
楼主也可以使用无类型指针(pointer)作为参数,或者使用无类型var参数。

热点排行