function TForm1.HexStrToByte(HesStr: String): Byte;
var
iLen: Integer;
begin
Result := 0;
iLen := length(HesStr);
if iLen <> 2 then Exit;
If not (HesStr[1] in ['0'..'9', 'A'..'F', 'a'..'f']) Then Exit;
If not (HesStr[2] in ['0'..'9', 'A'..'F', 'a'..'f']) Then Exit;
Result := StrToInt('$' + HesStr);
end;
字符串转字节数组
procedure TFlowSubtitles.btnOKClick(Sender: TObject);
var
nLength : Integer;
TxBuf_Com : array of Byte;
TxBuf_Net : array[0..13] of Byte; //发送数据数组
i, j, k, m : Integer; //循环
iCount : Integer; //数据大小
Ansi_Str: String; //宽字节
Wide_Str: WideString; //宽字节
WideChar_Byte_Array: Array of Byte; //宽字节转成byte数组
DateTemp : array of Byte; //保存转化成的数组
FlowSubtitlesDate : array of array of Byte; //保存转化后的十进制二维数组
begin
//Ansi_Str := edtFSDate.Text;
Ansi_Str := MemoDate.Text;
nLength := Length(Ansi_Str);
//字符串转成Unicode 存储在WideChar_Byte_Array字节数组中,存储的是十进制
Wide_Str := Ansi_Str; //转为Unicode
SetLength(WideChar_Byte_Array, Length(Wide_Str) * sizeof(WideChar)); //字节数 = Unicode字数 * Unicode单字的字节数
Move(PChar(Wide_Str)^, WideChar_Byte_Array[0], Length(Wide_Str) * sizeof(WideChar)); //复制到字节数组当中
nLength := Length(WideChar_Byte_Array) ;
SetLength(DateTemp, nLength + 2); //长度+2 因为转换出来的字节数组中含有字符串结束符,浅赋值,用同一内存地址
//一维数组赋值
for i := 0 to nLength do
begin
DateTemp[i] := WideChar_Byte_Array[i];
end;
///一维数组 转存成 二维数组/
iCount := (Length(DateTemp) div 2) - 1;
SetLength(FlowSubtitlesDate, iCount, 2);
for k := 0 to iCount -1 do
begin
for m := 0 to 1 do
begin
FlowSubtitlesDate[k,m] := DateTemp[k * 2 + m];
end;
end;
理论知识
string
string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节;
变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起始于@Str[1],@Str[1]偏移负16个字节的空间存储着字串长度、引用计数等信息。字符序列以NULL结束。
string[n]
string[n] = ShortString = 短字符串,最多容纳255个字符,实际长度是字符长度+1,是Delphi的简单类型;
Str[0]存储着字符的个数,第一个字符从Str[1]开始存放,不以NULL结束。
具体代码
字节数组转string
把buf内容赋给ShortString
var
buf: array[0..100] of byte;
str: string[32];//仅仅开辟了一个32个空间的内存,由于第1位没有用setlength初始化,导致长度不定
i :Integer;
begin
//如果在此处就对str进行赋值,str[0]位就有计数了,如果在使用之前没有对其进行使用,用SetLength进行赋值
for i := 50 to 81 do buf[i] := ord('A') + i -50;//测试数据
SetLength(str, 32);//设置str[0]=32;
Move(buf[50], str[1], 32);//内存复制
ShowMessage (str);
end;
把buf内容赋给AnsiString
string与string[]不一样,string是一个动态数组,还没有分配空间,而string[]已经预分配了空间,只不过str[0]处没赋初值,这时如果用Move的话会把Byte数组中的数据拷贝到string空间中,而string这时还没有分配内存,肯定会造成AV错误)
var
buf: array[0..100] of byte;
str: string;
i :Integer;
begin
for i := 50 to 81 do buf[i] := ord('A') + i -50;
SetLength(str, 32);
Move(buf[50], str[1], 32);//注意,这里是从str[1]开始复制的
ShowMessage (str);
end;
string转为字节数组
var
buf: array[0..100] of byte;
str: string;
begin
str:='abcdefg';
Move( str[1],buf[0], 32);//注意,这里是从str[1]开始复制的
ShowMessageFmt('$%.2d, $%.2d, $%.2d, $%.2d',[buf[3], buf[2], buf[1], buf[0]]);
end;
————————————————
版权声明:本文为CSDN博主「wangen12345」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangen12345/article/details/38817419