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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值