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));
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
图片看不见,什么异常?
#8
不能上图,真恶习;
Access voilation at address 00405F00 in module 'prj.exe',write of Address 004c3484
就这异常
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));
调试发现可以运行完所有语句,就是结尾跳出个异常来。
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;
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
这样结果又变成 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;
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
是这样啦,谢谢各位同志
#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
不用要Pchar(s)^这种写法, 会多一次从String到PChar的转换, 效率降低了。
另外,其实S[1]开始就是一个字节数组,不复制到array of Byte也可以当成字节数组来操作。
#18
呵呵,犯了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
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]来得直接而已
不用要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));
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
图片看不见,什么异常?
#8
不能上图,真恶习;
Access voilation at address 00405F00 in module 'prj.exe',write of Address 004c3484
就这异常
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));
调试发现可以运行完所有语句,就是结尾跳出个异常来。
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;
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
这样结果又变成 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;
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
是这样啦,谢谢各位同志
#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
不用要Pchar(s)^这种写法, 会多一次从String到PChar的转换, 效率降低了。
另外,其实S[1]开始就是一个字节数组,不复制到array of Byte也可以当成字节数组来操作。
#18
呵呵,犯了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
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]来得直接而已
不用要Pchar(s)^这种写法, 会多一次从String到PChar的转换, 效率降低了
---------------------------------------------------------------------
我不大同意这种说话,所谓的“转换”只是为了让Delphi把s指向的内存看成是以#0结尾的char数组,并没有做什么额外的操作,只是不如s[1]来得直接而已