怎么把字符串放入字节数组中?

时间:2021-07-10 11:04:46
字符串中有汉字,有英文字符,例如: 
var
 Arr: Array of Byte;
 Str:String;
begin
 Str:='a啊';   //数组中存的应该是 $61 $B0 $A1 
end;

help!

22 个解决方案

#1


Move(Str,Arr[0],Length(Str));

#2


Move(Str,Arr^,Length(Str));  //你这里是动态数组,没仔细看

#3


很少接触这个问题,路过学习

#4


楼上的不对啊,用你的方法,我读出来的是  84 30 4C,如下
  s:='a啊';
  SetLength(Arr,length(s));
  Move(s,Arr[0],Length(s));
  for i:=0 to Length(Arr)-1 do
     Mem_R.Lines.Append(InttoHex(Arr[i],2));


#5


很少接触这个问题,路过学习

#6


Move(s,Arr,Length(s));是可以,可是出现莫名其妙的异常啊。
怎么把字符串放入字节数组中?

#7


引用 6 楼 lunyx 的回复:
Move(s,Arr,Length(s));是可以,可是出现莫名其妙的异常啊。


图片看不见,什么异常?

#8


不能上图,真恶习;
Access voilation at address 00405F00 in module 'prj.exe',write of Address 004c3484
就这异常

#9


  s:='a啊';
  SetLength(Arr,length(s));
  Move(s,Arr,Length(s));
  for i:=0 to Length(Arr)-1 do
    Mem_R.Lines.Append(InttoHex(Arr[i],2));

调试发现可以运行完所有语句,就是结尾跳出个异常来。

#10



var 
  Arr: Array of Byte;
  Str:String;
  I : Integer;
begin
  Str:='a啊';
  SetLength(Arr,length(Str));
  Move(Str,pointer(Arr)^,Length(Str));
  for i:=Low(Arr) to High(Arr) do
    Memo1.Lines.Append(InttoHex(Arr[i],2));

end;


#11


这样才对:
var ByteAry:Array of Byte;
    s:String;
begin
  s:='abcdefg';
  SetLength(ByteAry,Length(s));
  Move(pchar(s)^,Pointer(ByteAry)^,Length(s));
  showmessage(pchar(ByteAry));
end;

#12


引用 10 楼 kfcoffe 的回复:
Delphi(Pascal) codevar 
  Arr: Arrayof Byte;
  Str:String;
  I : Integer;begin
  Str:='a啊';
  SetLength(Arr,length(Str));
  Move(Str,pointer(Arr)^,Length(Str));for i:=Low(Arr)to High(Arr)do
    Memo1.Lines.Append(InttoHex(Arr[i],2));end;


这样结果又变成 8C 34 4C 了

#13


应该是这样的:

  ......
  s:='a啊';
  SetLength(Arr, Length(s));
  Move(s[1], Arr[0], Length(s));
  ......

#14


var 
  Arr: Array of Byte;
  Str:String;
  I : Integer;
begin
  Str:='a啊';
  SetLength(Arr,length(Str));
  Move(pchar(Str)^,pointer(Arr)^,Length(Str));
  for i:=Low(Arr) to High(Arr) do
    Memo1.Lines.Append(InttoHex(Arr[i],2));

end;

#15


引用 10 楼 kfcoffe 的回复:
Delphi(Pascal) codevar 
  Arr: Arrayof Byte;
  Str:String;
  I : Integer;begin
  Str:='a啊';
  SetLength(Arr,length(Str));
  Move(Str,pointer(Arr)^,Length(Str));for i:=Low(Arr)to High(Arr)do
    Memo1.Lines.Append(InttoHex(Arr[i],2));end;

是这样啦,谢谢各位同志

#16




var
  Arr: Array of Byte;
  Str:String;
  I : Integer;
begin
  Str:='a啊';
  SetLength(Arr,length(Str));
  Move(pchar(Str)^,pointer(Arr)^,Length(Str));
  for i:=Low(Arr) to High(Arr) do
    Memo1.Lines.Append(InttoHex(Arr[i],2));


这样

#17


引用 15 楼 lunyx 的回复:
引用 10 楼 kfcoffe 的回复:<br /> Delphi(Pascal) codevar <br /> &nbsp; Arr: Arrayof Byte; <br /> &nbsp; Str:String; <br /> &nbsp; I : Integer;begin <br /> &nbsp; Str:=&#39;a啊&#39;; <br /> &nbsp; SetLength(Arr,length(Str)); <br /> &nbsp; Move(Str,pointer(Arr)^,Length(Str));for i:=Low(Arr)to High(Arr)do <br /> &nbsp; &nbsp; Memo1.Lines.Append(InttoHex(Arr[i],2));end; <br />
是这样啦,谢谢各位同志


不用要Pchar(s)^这种写法, 会多一次从String到PChar的转换, 效率降低了。

另外,其实S[1]开始就是一个字节数组,不复制到array of Byte也可以当成字节数组来操作。

#18


引用 16 楼 kfcoffe 的回复:
Delphi(Pascal) codevar
  Arr: Arrayof Byte;
  Str:String;
  I : Integer;begin
  Str:='a啊';
  SetLength(Arr,length(Str));
  Move(pchar(Str)^,pointer(Arr)^,Length(Str));for i:=Low(Arr)to High(Arr)do
    Memo1.Lines.Append(InttoHex(Arr[i],2));

这样


呵呵,犯了1个低级错误,语言学多了 ,就容易这样!    delphi中string从[1]开始地。
Move(str[1],pointer(Arr)^,Length(Str));

#19


其实move 里面就是pchar(Source)

#20



//请参见一下string的数据结构,str[1]位置才是真正存字符串的位置
var
  buf: array[0..2] of byte;
  str: string;

begin
  str:='a啊';
  Move( str[1],buf[0], 3);
  ShowMessageFmt('$%.2x, $%.2x, $%.2x ', [  buf[2], buf[1], buf[0]]);

end;

#21


动态数组,这样可以:
procedure TForm1.Button1Click(Sender: TObject);
var
Arr: Array of Byte;
Str:String;
s:integer;
begin
Str:='a啊';  //数组中存的应该是 $61 $B0 $A1 
s:=length(Str);
SetLength(Arr, s+1);  //申请内存
Move (Str[1],Arr[0],s); //因为Str从1开始的,所以要Str[1]
 ShowMessageFmt('$%.2x, $%.2x, $%.2x ', [ Arr[0], Arr[1], Arr[2]]);
end;
------------------------------
结果为: $61 $B0 $A1 

#22


to jadeluo:
不用要Pchar(s)^这种写法, 会多一次从String到PChar的转换, 效率降低了

---------------------------------------------------------------------
我不大同意这种说话,所谓的“转换”只是为了让Delphi把s指向的内存看成是以#0结尾的char数组,并没有做什么额外的操作,只是不如s[1]来得直接而已

#1


Move(Str,Arr[0],Length(Str));

#2


Move(Str,Arr^,Length(Str));  //你这里是动态数组,没仔细看

#3


很少接触这个问题,路过学习

#4


楼上的不对啊,用你的方法,我读出来的是  84 30 4C,如下
  s:='a啊';
  SetLength(Arr,length(s));
  Move(s,Arr[0],Length(s));
  for i:=0 to Length(Arr)-1 do
     Mem_R.Lines.Append(InttoHex(Arr[i],2));


#5


很少接触这个问题,路过学习

#6


Move(s,Arr,Length(s));是可以,可是出现莫名其妙的异常啊。
怎么把字符串放入字节数组中?

#7


引用 6 楼 lunyx 的回复:
Move(s,Arr,Length(s));是可以,可是出现莫名其妙的异常啊。


图片看不见,什么异常?

#8


不能上图,真恶习;
Access voilation at address 00405F00 in module 'prj.exe',write of Address 004c3484
就这异常

#9


  s:='a啊';
  SetLength(Arr,length(s));
  Move(s,Arr,Length(s));
  for i:=0 to Length(Arr)-1 do
    Mem_R.Lines.Append(InttoHex(Arr[i],2));

调试发现可以运行完所有语句,就是结尾跳出个异常来。

#10



var 
  Arr: Array of Byte;
  Str:String;
  I : Integer;
begin
  Str:='a啊';
  SetLength(Arr,length(Str));
  Move(Str,pointer(Arr)^,Length(Str));
  for i:=Low(Arr) to High(Arr) do
    Memo1.Lines.Append(InttoHex(Arr[i],2));

end;


#11


这样才对:
var ByteAry:Array of Byte;
    s:String;
begin
  s:='abcdefg';
  SetLength(ByteAry,Length(s));
  Move(pchar(s)^,Pointer(ByteAry)^,Length(s));
  showmessage(pchar(ByteAry));
end;

#12


引用 10 楼 kfcoffe 的回复:
Delphi(Pascal) codevar 
  Arr: Arrayof Byte;
  Str:String;
  I : Integer;begin
  Str:='a啊';
  SetLength(Arr,length(Str));
  Move(Str,pointer(Arr)^,Length(Str));for i:=Low(Arr)to High(Arr)do
    Memo1.Lines.Append(InttoHex(Arr[i],2));end;


这样结果又变成 8C 34 4C 了

#13


应该是这样的:

  ......
  s:='a啊';
  SetLength(Arr, Length(s));
  Move(s[1], Arr[0], Length(s));
  ......

#14


var 
  Arr: Array of Byte;
  Str:String;
  I : Integer;
begin
  Str:='a啊';
  SetLength(Arr,length(Str));
  Move(pchar(Str)^,pointer(Arr)^,Length(Str));
  for i:=Low(Arr) to High(Arr) do
    Memo1.Lines.Append(InttoHex(Arr[i],2));

end;

#15


引用 10 楼 kfcoffe 的回复:
Delphi(Pascal) codevar 
  Arr: Arrayof Byte;
  Str:String;
  I : Integer;begin
  Str:='a啊';
  SetLength(Arr,length(Str));
  Move(Str,pointer(Arr)^,Length(Str));for i:=Low(Arr)to High(Arr)do
    Memo1.Lines.Append(InttoHex(Arr[i],2));end;

是这样啦,谢谢各位同志

#16




var
  Arr: Array of Byte;
  Str:String;
  I : Integer;
begin
  Str:='a啊';
  SetLength(Arr,length(Str));
  Move(pchar(Str)^,pointer(Arr)^,Length(Str));
  for i:=Low(Arr) to High(Arr) do
    Memo1.Lines.Append(InttoHex(Arr[i],2));


这样

#17


引用 15 楼 lunyx 的回复:
引用 10 楼 kfcoffe 的回复:<br /> Delphi(Pascal) codevar <br /> &nbsp; Arr: Arrayof Byte; <br /> &nbsp; Str:String; <br /> &nbsp; I : Integer;begin <br /> &nbsp; Str:=&#39;a啊&#39;; <br /> &nbsp; SetLength(Arr,length(Str)); <br /> &nbsp; Move(Str,pointer(Arr)^,Length(Str));for i:=Low(Arr)to High(Arr)do <br /> &nbsp; &nbsp; Memo1.Lines.Append(InttoHex(Arr[i],2));end; <br />
是这样啦,谢谢各位同志


不用要Pchar(s)^这种写法, 会多一次从String到PChar的转换, 效率降低了。

另外,其实S[1]开始就是一个字节数组,不复制到array of Byte也可以当成字节数组来操作。

#18


引用 16 楼 kfcoffe 的回复:
Delphi(Pascal) codevar
  Arr: Arrayof Byte;
  Str:String;
  I : Integer;begin
  Str:='a啊';
  SetLength(Arr,length(Str));
  Move(pchar(Str)^,pointer(Arr)^,Length(Str));for i:=Low(Arr)to High(Arr)do
    Memo1.Lines.Append(InttoHex(Arr[i],2));

这样


呵呵,犯了1个低级错误,语言学多了 ,就容易这样!    delphi中string从[1]开始地。
Move(str[1],pointer(Arr)^,Length(Str));

#19


其实move 里面就是pchar(Source)

#20



//请参见一下string的数据结构,str[1]位置才是真正存字符串的位置
var
  buf: array[0..2] of byte;
  str: string;

begin
  str:='a啊';
  Move( str[1],buf[0], 3);
  ShowMessageFmt('$%.2x, $%.2x, $%.2x ', [  buf[2], buf[1], buf[0]]);

end;

#21


动态数组,这样可以:
procedure TForm1.Button1Click(Sender: TObject);
var
Arr: Array of Byte;
Str:String;
s:integer;
begin
Str:='a啊';  //数组中存的应该是 $61 $B0 $A1 
s:=length(Str);
SetLength(Arr, s+1);  //申请内存
Move (Str[1],Arr[0],s); //因为Str从1开始的,所以要Str[1]
 ShowMessageFmt('$%.2x, $%.2x, $%.2x ', [ Arr[0], Arr[1], Arr[2]]);
end;
------------------------------
结果为: $61 $B0 $A1 

#22


to jadeluo:
不用要Pchar(s)^这种写法, 会多一次从String到PChar的转换, 效率降低了

---------------------------------------------------------------------
我不大同意这种说话,所谓的“转换”只是为了让Delphi把s指向的内存看成是以#0结尾的char数组,并没有做什么额外的操作,只是不如s[1]来得直接而已