字串是:
AA 02 DF 07 31 00 31 00
AA 是标志,02 是长度 DF 07 是2008年 31 00 31 00=11
标志(byte)|长度(byte)|日期(word)|内容(Widestring)这个长度是后面内容的长度。现在想把这个字串放到自定义的结构中:type
 Tmsg=packed reocrd
 Flg,len:byte;
 SData:word;
 info:Widestring;
end;。
var str:string; 
msg:Tmsg;
begin
 str:='AA02DF0731003100';
下面如何 把 str 的内容放到 msg 这个结构中呢?
最后要得到:
 msg.flg:=AA
 msg.len:=02;
 msg.Sdata:=DF07
 msg.info:=31003100类似于一个局域网通信的程序。所以后面的内容变化。前面的长度也会变化。所以想通过一个自定义的结构来操作。感觉上要方便点吧。不过不太会。

解决方案 »

  1.   

    var
      str, Str1: AnsiString;  msg:Tmsg;
      iLen: Integer;
    begin
      str:='AA02DF0731003100';
      SetLength(str1,Length(str) div 2);
      HexToBin(PAnsiChar(str), PAnsiChar(str1), Length(str) div 2);
      iLen := sizeof(TMSG) - sizeof(WideString);
      Move(PAnsiChar(str1)^, msg, iLen);
      SetLength(msg.info, (length(str1) - ilen) div 2);
      move(PAnsiChar(LongWord(PAnsiChar(str1)) + iLen)^, Pointer(msg.info)^, Length(str1) - iLen);
    end;
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    type
    Tmsg=packed record
    Flg,len:byte;
    SData:word;
    info:array[0..3] of char;
    end;
    var
      str:string;
      msg:Tmsg;
    begin
    str:='AA02DF0731003100';  move(pchar(str)^,msg,8);
      showMessage(msg.info);
    end; 不太通用。呵呵
      

  3.   

    如果后面总是2unicode char的话,这么声明:type
      Tmsg = packed reocrd 
        Flag, Len: Byte; 
        SData: Word; 
        Info: array[0..1]of WideChar; 
      end; 
      Pmsg = ^Tmsg;function BufferToMsg(cosnt Buffer): Tmsg; // Buffer = a value stored $AA$02$DF$07$31$00$31$00
    begin
      Result := Tmsg(Buffer);
    end;function StringToMsg(const Source: AnsiString): Tmsg; // Source = 'AA02DF0731003100'
    var
      s: string;
      l: Integer;
    begin
      l := Length(Source);
      SetLength(s, l shr 1);
      HexToBin(Pointer(Source), Pointer(s);
      Result := Pmsg(s)^;
    end;即可。
      

  4.   

    一个例子:procedure StrToRec(S: String;  var R: Tmsg);
    var
      Buf : array of Byte;
    begin
      SetLength(Buf, Length(S) div 2);
      HexToBin(PChar(S), @Buf[0], Length(S) div 2);
      R.Flg := Buf[0];
      R.len := Buf[1];
      Move (Buf[2], R.SData, 2);
      SetLength(R.info, R.len);
      Move (Buf[4], R.info[1], R.len * 2);
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      R : Tmsg;
    begin
      StrToRec('AA02DF0731003100', R);
      ShowMessage (IntToStr(R.Flg));
      ShowMessage (IntToStr(R.len));
      ShowMessage (IntToStr(R.sData));
      ShowMessage (R.info);
    end;