pchar 指示的Char数组 如何转换成byte格式的数据?

疯狂低调 2008-02-26 06:40:36
定义:
InputBuffer : Array [0..1024] of Char;
dwNumberOfBytesRead : integer;

调用:
AddToMemo(InputBuffer,dwNumberOfBytesRead);

AddToMemo的定义为:AddToMemo(Str: PChar; Len: Dword);


问题:
我想在AddToMemo函数体内,对传过来的Str:Pchar的每一个元素进行读取,由于程序调用AddToMemo(InputBuffer,dwNumberOfBytesRead);时,传入的参数为Char数组和长度,而Char数组中的元素实际上是Ascii码,但是在AddToMemo中却被转换成了Str:Pchar类型,请问我如何能够在AddToMemo函数体内取得数组的每一个元素的Ascii码。
...全文
209 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
帖还是要回的
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
接分先!
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
lz要干嘛?
ysai 2008-02-28
  • 打赏
  • 举报
回复
我写的是
p := str;
没带@
p是指针,str本就是指针,你还取它地址就错了.
如果p := str;报编译错误(与编译选项有关),那就改为
p := Pointer(str);
疯狂低调 2008-02-28
  • 打赏
  • 举报
回复
procedure TfrmMain.AddToMemoPlus(Str: PChar;Len: DWord);
var
p : PByte;
i : integer;
begin

p := @str;

for i := 0 to len - 1 do
begin
Memo1.Lines.Add(IntToStr(Ord((p^))));
inc(p,1);
end;

end;

这段代码是参考Ysai在四楼所写的代码,实际上传入str的值应该是类似于"02 30 30 32 37 32 44"(中间无空格)这样的内容,但是使用这段代码得出的却不是刚才的Ascii码,而是一些其他的大于127的内容,这个我不太明白了。
疯狂低调 2008-02-28
  • 打赏
  • 举报
回复
太感谢大家的帮忙了,对我受益非浅,随后结贴,请注意查收。
lihuasoft 2008-02-27
  • 打赏
  • 举报
回复
错错错!
呵呵
上层楼我的p := @str;不对,应该是:
LongWord(p) := LongWord(str);
lihuasoft 2008-02-27
  • 打赏
  • 举报
回复
ysai说得是。我那第三种方法确实考虑不周。

另外,ysai直接用PByte指针的思路很简明。给楼主多个答案的目的,是想告诉楼主:内存块还是那块内存块,数据还是那些数据,就看你如何看待它了。

ysai的代码中, p := str; 我觉得最好改为 p := @str; 纵然指针之间的赋值是可以的,但我这里Delphi7默认设置下这样写一直编译通不过(以前也遇到过)。
ysai 2008-02-27
  • 打赏
  • 举报
回复
像你这种情况,不要乱用strpas,即不要随便把pchar转成string,因为你的源数据里可能含有#0
var
p : array[0..3] of char;
s : string;
begin
p[0] := 'a';
p[1] := #0;
p[2] := 'b';
p[3] := #0;
setlength(s, 4);
copymemory(@s[1], @p[0], 4);
ShowMessage(strpas(p)[3]);
ShowMessage(s[3]);
end;
ysai 2008-02-27
  • 打赏
  • 举报
回复
var
p : PByte;
i : integer;
begin
p := str;
for i := 0 to len - 1 do
begin
showmessage(inttostr(p^));
inc(p);
end;
end;
ZuoBaoquan 2008-02-27
  • 打赏
  • 举报
回复
PChar = ^Char;
lihuasoft 2008-02-26
  • 打赏
  • 举报
回复
第三种写法:


procedure AddToMemo(Str: PChar; Len: Dword);
var
I : integer;
begin
for I := 1 to Len do
Showmessage(InttoStr(Byte(StrPas(Str)[I])));
end;
lihuasoft 2008-02-26
  • 打赏
  • 举报
回复
给你两种写法:

第一种:


var
InputBuffer : array [0..6] of Char;
dwNumberOfBytesRead : integer;

procedure AddToMemo(Str: PChar; Len: Dword);
var
TempByteArr: array of Byte;
I : integer;
begin
SetLength(TempByteArr, Len);
TempByteArr := Pointer(Str);
for I := 0 to Len-1 do
Showmessage(InttoStr(TempByteArr[I]));
end;
///////////////////以下是测试//////////////
procedure TForm1.Button1Click(Sender: TObject);
begin
InputBuffer[0] := 'a';
InputBuffer[1] := 'b';
InputBuffer[2] := 'c';
InputBuffer[3] := 'a';
InputBuffer[4] := 'b';
InputBuffer[5] := 'c';
InputBuffer[6] := 'd';
dwNumberOfBytesRead := Length(InputBuffer);
AddToMemo(InputBuffer,dwNumberOfBytesRead);
end;


第二种:


type
TArrByte = array of Byte;

var
InputBuffer : array [0..6] of Char;
dwNumberOfBytesRead : integer;

procedure AddToMemo(Str: PChar; Len: Dword);
var
I : integer;
begin
for I := 0 to Len-1 do
Showmessage(InttoStr(TArrByte(Str)[I]));
end;
///////////////////以下是测试//////////////
procedure TForm1.Button1Click(Sender: TObject);
begin
InputBuffer[0] := 'a';
InputBuffer[1] := 'b';
InputBuffer[2] := 'c';
InputBuffer[3] := 'a';
InputBuffer[4] := 'b';
InputBuffer[5] := 'c';
InputBuffer[6] := 'd';
dwNumberOfBytesRead := Length(InputBuffer);
AddToMemo(InputBuffer,dwNumberOfBytesRead);
end;

16,748

社区成员

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

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