Delphi 中string字符串转换Byte[]字节数组

mac2024-03-09  19

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; ———————————————— 版权声明:本文为博主「wangen12345」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/wangen12345/article/details/38817419

最新回复(0)