定义:
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码。

解决方案 »

  1.   

    给你两种写法:第一种:
    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;
      

  2.   

    第三种写法:
    procedure AddToMemo(Str: PChar; Len: Dword);
    var
      I : integer;
    begin
      for I := 1 to Len do
        Showmessage(InttoStr(Byte(StrPas(Str)[I])));
    end;
      

  3.   

    PChar = ^Char;
      

  4.   

    var
      p : PByte;
      i : integer;
    begin
      p := str;
      for i := 0 to len - 1 do
      begin
        showmessage(inttostr(p^));
        inc(p);
      end;
    end;
      

  5.   

    像你这种情况,不要乱用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;
      

  6.   

    ysai说得是。我那第三种方法确实考虑不周。另外,ysai直接用PByte指针的思路很简明。给楼主多个答案的目的,是想告诉楼主:内存块还是那块内存块,数据还是那些数据,就看你如何看待它了。ysai的代码中,  p := str; 我觉得最好改为   p := @str; 纵然指针之间的赋值是可以的,但我这里Delphi7默认设置下这样写一直编译通不过(以前也遇到过)。
      

  7.   

    错错错!
    呵呵
    上层楼我的p   :=   @str;不对,应该是:
      LongWord(p) := LongWord(str);
      

  8.   

    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的内容,这个我不太明白了。
      

  9.   

    我写的是
    p := str;
    没带@
    p是指针,str本就是指针,你还取它地址就错了.
    如果p := str;报编译错误(与编译选项有关),那就改为
    p := Pointer(str);