很短的一段VC代码转D代码

chengangcsdn 2006-07-12 11:16:25
char strBuf[1024] = {0};


CFile file;
char* pReadbuf = NULL;
char* pSend = NULL;
long lSize = 0;


if(!file.Open("e:\\x1.jpg", CFile::modeRead | CFile::shareDenyWrite))
{
//_OutPut("打开文件失败\n");
}
else
{

lSize = file.GetLength();
pReadbuf = new char[lSize];
memset(pReadbuf, 0, lSize);


CString strCMD;
strCMD.Format("<ILAS>31;;T00516;%d;", lSize);
int nCmdLen = strlen(strCMD);

file.ReadHuge(pReadbuf, lSize);

//ADD ;</ILAS>
int nSendSize = nCmdLen + lSize + 8;
pSend = new char[nSendSize];

memset(pSend, 0, nSendSize);

memcpy(pSend, strCMD.GetBuffer(0), nCmdLen);
memcpy(pSend + nCmdLen, pReadbuf, lSize);

char strTmp[] = ";</ILAS>";

memcpy(pSend + nCmdLen + lSize, strTmp, strlen(strTmp));

delete[] pReadbuf;
delete[] pSend;
}
...全文
275 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lonoaer 2006-07-13
  • 打赏
  • 举报
回复
星星的确是星星,有空向你多请教请教哈。
lonoaer 2006-07-13
  • 打赏
  • 举报
回复
to keiy()
用你说的方法查看了一下,我们程序都是对的,我的确只是简单的用查看字符串的方式看了一下,就妄下结论,嘿嘿,又学习了一下。
柯本 2006-07-13
  • 打赏
  • 举报
回复
在VC中,同样,要显示pSend的内容不能简单的将它用MessageBox等显示字符的方式输出,因为VC的字串以0结束,你要看它的内存或将它存到二进制文件就知了
柯本 2006-07-13
  • 打赏
  • 举报
回复
我估计你看错了,我作以下测试,就按你所说:
x1.jgp的内容为:
00 60 27 88 88 // 十六进制,以#00开头+`'后面的$88 $88为结束标记:
在 freemem(pSend);上加断点,pSend的结果为:
$3C $49 $4C $41 $53 $3E $33 $31 $3B $3B $54 $30 $30 $35 $31 $36 $3B $36 $3B $00 $60 $27 $88 $88 $88 $3B $3C $2F $49 $4C $41 $53 $3E $00
你不能用字符显示的方式,要用pSend,100m这样的方式或在cpu调试窗口它的内容
00CE3850 3C 49 4C 41 53 3E 33 31 3B 3B 54 30 <ILAS>31;;T0
00CE3860 30 35 31 36 3B 36 3B 00 2A 00 00 00 3C 49 4C 41 0516;6;.*...<ILA
00CE3870 53 3E 33 31 3B 3B 54 30 30 35 31 36 3B 36 3B 00 S>31;;T00516;6;.
00CE3880 60 27 88 88 88 3B 3C 2F 49 4C 41 53 3E `'垐?</ILAS>

lonoaer 2006-07-13
  • 打赏
  • 举报
回复
你得程序也存在同样问题
柯本 2006-07-12
  • 打赏
  • 举报
回复
我测试了一下,我的程序没问题
lonoaer 2006-07-12
  • 打赏
  • 举报
回复
找到一个*.jpg
在VC和DELPHI里面都测试了一下,该段代码都不能成功的读取文件的内容。
发现如果说文件的内容开始如果为‘ ’或者#0等等,用PCHAR则不能成功读取
而用CHAR BUF[INT]则可以
lonoaer 2006-07-12
  • 打赏
  • 举报
回复
是的,如果用了pSend := pSend+xxxxxxx的话其指针移动,如果在结尾把它还原还是一样的
可惜,我的电脑上面没有*.jpg文件要不然可以测试一下。
柯本 2006-07-12
  • 打赏
  • 举报
回复
to:lonoaer()
move(pSend, pchar(strCMD)^, nCmdLen); //这个有错,跟我开始一样,如果pSend是pchar类型,要写成
move(pSend^, pchar(strCMD)^, nCmdLen);
如果是array [0..100] of char,就可以(后面的类同)
另外,不能用pSend加,因为最后 freemem(pSend);要错
还有,我只比你慢了几分钟,我们写的几乎一样

柯本 2006-07-12
  • 打赏
  • 举报
回复
//测试通过,上面有n多错
procedure TForm1.Button1Click(Sender: TObject);
var
filem:tmemorystream;
pReadbuf:pchar;
pSend:pchar;
lSize:integer;
strCMD:String;
nCmdLen, nSendSize:integer;
strTmp:pchar;
tmpp:pchar;

begin
filem:=tmemorystream.Create;
try
filem.LoadFromFile('e:\x1.jpg');
except;
ShowMessage('打开文件失败');
exit;
end;
filem.Position:=0;

lSize := filem.Size;
getmem(pReadbuf, lSize);
Fillchar(pReadbuf^, lSize,0);

strCMD:=Format('<ILAS>31;;T00516;%d;', [lSize]);
nCmdLen := length(strCMD);

filem.Read(pReadbuf^, lSize);
nSendSize := nCmdLen + lSize + 8;
getmem(pSend,nSendSize);
fillchar(pSend^, nSendSize,0);

move( pchar(strCMD)^,pSend^, nCmdLen);
tmpp:=pSend+nCmdLen;
move( pReadbuf^,tmpp^ , lSize);

strTmp := ';</ILAS>';

tmpp:=tmpp+ lSize;
move( strTmp^, tmpp^,strlen(strTmp));
freemem(pReadbuf);
freemem(pSend);
filem.Free;

end;
柯本 2006-07-12
  • 打赏
  • 举报
回复
按C程序写了一个,对与否你测试一下
procedure TForm1.Button1Click(Sender: TObject);
var
filem:tmemorystream;
pReadbuf:pchar;
pSend:pchar;
lSize:dword;
strCMD:String;
nCmdLen, nSendSize:integer;
strTmp:pchar;

begin
filem:=tmemorystream.Create;
try
filem.LoadFromFile('e:\\x1.jpg');
except;
ShowMessage('打开文件失败');
exit;
end;
filem.Position:=0;

lSize := filem.Size;
getmem(pReadbuf, lSize);
Fillchar(pReadbuf, lSize,0);

strCMD:=Format('<ILAS>31;;T00516;%d;', [lSize]);
nCmdLen := length(strCMD);

filem.Read(pReadbuf, lSize);
nSendSize := nCmdLen + lSize + 8;
getmem(pSend,nSendSize);
fillchar(pSend, nSendSize,0);

move(pSend, pchar(strCMD)^, nCmdLen);
pSend:=pSend+nCmdLen;
move(pSend , pReadbuf, lSize);

strTmp := ';</ILAS>';

pSend:=pSend+ lSize;
move(pSend, strTmp, strlen(strTmp));
freemem(pReadbuf);
freemem(pSend);

end;
lonoaer 2006-07-12
  • 打赏
  • 举报
回复
const
strTmp = ';</ILAS>';
var
pReadBuf,
pSendBuf: PChar;
AFileStream: TFileStream;
strCMD: String;
lSize: LongWord;
nCmdLen: Integer;
nSendsize: Integer;
aPath: String;
begin
aPath := 'c:\aaaa.TXT';
if Not FileExists(aPath) then exit;

AFileStream := TFileStream.Create(APath, fmOpenRead or fmShareDenyWrite);
try
lSize := AFileStream.Size;

pReadBuf := AllocMem(lSize);
try
ZeroMemory(pReadBuf, lSize);
AFileStream.Position := 0;
AFileStream.ReadBuffer(pReadBuf^, lSize);
strCMD := Format('<ILAS>31;;T00516;%d;', [lSize]);
nCmdLen := Length(strCMD);

nSendsize := nCmdLen + lSize + 8;

pSendBuf := AllocMem(nSendsize);
try
ZeroMemory(pSendBuf, nSendSize);
CopyMemory(pSendBuf, @strCMD[1], nCmdLen);
CopyMemory(pSendBuf+nCmdLen, pReadBuf, lSize);

CopyMemory(pSendBuf+nCmdLen+lSize, @strTmp[1], Length(strTmp));
finally
FreeMem(pSendBuf);
pSendBuf := Nil;
end;
finally
FreeMem(pReadBuf);
pReadBuf := Nil;
end;
finally
FreeAndNiL(AFileStream);
end;
因为我机器上找*.jpg文件,所以就用TXT代替了,你自己测试一哈
huitouren519 2006-07-12
  • 打赏
  • 举报
回复
学习
chengangcsdn 2006-07-12
  • 打赏
  • 举报
回复
期待高手写一下子.
lonoaer 2006-07-12
  • 打赏
  • 举报
回复
把CFile用TFileStream试一下,其他好象都没有什么难度

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧