如何将record 类型转换成 string类型

时间:2021-03-30 19:36:01
如何将下面的record 类型转换成 string类型,即string类型的数据报。

  ARP_HDR = packed record
HardwareType:            WORD;
ProtocolType:            WORD;
HLen:                    UCHAR;
PLen:                    UCHAR;
Operation:               WORD;
SenderHA:                MACADDRESS;
SenderIP:                DWORD;
TargetHA:                MACADDRESS;
TargetIP:                DWORD;
  end;

10 个解决方案

#1


顶!

#2


最简单的方法:把记录中的每一个元素都转换成String,然后加上分隔符进行拼接成String的数据包!

#3


TTestRec = record
    a: Integer;
    b: Integer;
    c: array[0..10] of Char;
  end;

procedure TForm1.Button2Click(Sender: TObject);
var
  t: TTestRec;
  buf: array[0..30] of Char;
  s, s1: string;
begin
  t.a := 10;
  t.b := 20;
  StrCopy(t.c, PChar('Hello World'));

  s1 := Format('%d%d%s', [t.a, t.b, t.c]);
  wsprintf(buf, PChar(s1));
  s := buf;
  ShowMessage(s);
end;

#4


to beyondtkl(大龙驹<*学习祖国医学中,国粹,路在何方?*>) 
你的方法主要用到的是下面这句
s1 := Format('%d%d%s', [t.a, t.b, t.c]);

这样,的确是可以达到目的,但是如果还要还原那就麻烦了

所以可以改成如下:
s1 := Format'%d,%d,%s',[t.a, t.b, t.c]);
以','字符来分隔之
但这样也有一定的局限性,即t.c中不应包含','字符

#5


如果你是为了在网络里传输,还不如写个简单的类,传对象过去,
那样问题就容易解决多了:类(对象).属性,接收短只要有该类的定义就行了,你用record就不方便了

#6


楼主要把它加在一起做什么呢?有什么用呢?如果要传输的话,传递结构体指针啊。

#7


>>如何将下面的record 类型转换成 string类型,即string类型的数据报。
你的想法, 不不好, 
用 string, 很容易出bug, 
但也可解决, 用 TStringStream 就可


 sm: TStringStream;
begin
    t.a := 10;
  t.b := 20;
  StrCopy(t.c, PChar('Hello World'));

   sm := TStringStream.Create('');
   sm.Write((@t)^, sizeof(TTestRec));

    sm.DataString  ;// 你要的

   sm.Free;

#8


to dabaicai(菜鸟)
在网络里传对象?用什么方式传?值传递还是指针传递?

to  Delphityro(不吃腥的猫)
网络里怎么传递结构体指针?
 

#9


还是C/C++好

struct A a;
struct A pb;
char *pa;

pa = (char *)&a;

pb = (struct A*)pa;

直接转换 即可 好像delphi不行呢。。


网络里怎么传递结构体指针?
// 当成 字符串传就是 接受的时候进行转换就OK。

#10


看了一下 beyondtkl(大龙驹<*学习祖国医学中,国粹,路在何方?*>) 
和 aiirii(ari-淘金坑)的代码

是不是可以这样理解:

先把结构体的内存块复制下来,
通过流或字符串的方式进行传递,
收到以后,再用指针指向收到的内存块?
不过Delphi里类型检查比较严格,转换起来恐怕很难啊

COM和Webservice里对传递自定义类型都有比较好的办法
建议楼主采用

#1


顶!

#2


最简单的方法:把记录中的每一个元素都转换成String,然后加上分隔符进行拼接成String的数据包!

#3


TTestRec = record
    a: Integer;
    b: Integer;
    c: array[0..10] of Char;
  end;

procedure TForm1.Button2Click(Sender: TObject);
var
  t: TTestRec;
  buf: array[0..30] of Char;
  s, s1: string;
begin
  t.a := 10;
  t.b := 20;
  StrCopy(t.c, PChar('Hello World'));

  s1 := Format('%d%d%s', [t.a, t.b, t.c]);
  wsprintf(buf, PChar(s1));
  s := buf;
  ShowMessage(s);
end;

#4


to beyondtkl(大龙驹<*学习祖国医学中,国粹,路在何方?*>) 
你的方法主要用到的是下面这句
s1 := Format('%d%d%s', [t.a, t.b, t.c]);

这样,的确是可以达到目的,但是如果还要还原那就麻烦了

所以可以改成如下:
s1 := Format'%d,%d,%s',[t.a, t.b, t.c]);
以','字符来分隔之
但这样也有一定的局限性,即t.c中不应包含','字符

#5


如果你是为了在网络里传输,还不如写个简单的类,传对象过去,
那样问题就容易解决多了:类(对象).属性,接收短只要有该类的定义就行了,你用record就不方便了

#6


楼主要把它加在一起做什么呢?有什么用呢?如果要传输的话,传递结构体指针啊。

#7


>>如何将下面的record 类型转换成 string类型,即string类型的数据报。
你的想法, 不不好, 
用 string, 很容易出bug, 
但也可解决, 用 TStringStream 就可


 sm: TStringStream;
begin
    t.a := 10;
  t.b := 20;
  StrCopy(t.c, PChar('Hello World'));

   sm := TStringStream.Create('');
   sm.Write((@t)^, sizeof(TTestRec));

    sm.DataString  ;// 你要的

   sm.Free;

#8


to dabaicai(菜鸟)
在网络里传对象?用什么方式传?值传递还是指针传递?

to  Delphityro(不吃腥的猫)
网络里怎么传递结构体指针?
 

#9


还是C/C++好

struct A a;
struct A pb;
char *pa;

pa = (char *)&a;

pb = (struct A*)pa;

直接转换 即可 好像delphi不行呢。。


网络里怎么传递结构体指针?
// 当成 字符串传就是 接受的时候进行转换就OK。

#10


看了一下 beyondtkl(大龙驹<*学习祖国医学中,国粹,路在何方?*>) 
和 aiirii(ari-淘金坑)的代码

是不是可以这样理解:

先把结构体的内存块复制下来,
通过流或字符串的方式进行传递,
收到以后,再用指针指向收到的内存块?
不过Delphi里类型检查比较严格,转换起来恐怕很难啊

COM和Webservice里对传递自定义类型都有比较好的办法
建议楼主采用