用sendbuf发送数据这种形式怎么组织啊??

我用delphi的TServerSocket的sendbuf向手持机发送数据,要求以以下格式组织:
A5C3 LEN SEQ RAW DATA A599
Flag(2byte) Length(3 byte) Sequence(12byte) Data Flag(2byte)
举例:
给模块输入:A5 C3 00 00 00 00 41 42 43 44 A5 99
则接受端收到:ABCD
注释:0123456789ABCDEF对应的16进制30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46

假如我发送ABCD到手持机,则需要将A5 C3 00 00 00 00 41 42 43 44 A5 99组织成一个数组,
我想可以是byte类型或char(也可能是其他)。但我不知道怎么进行组织,帮帮我吧,急啊!
[430 byte] By [wspdelphi] at [2008-5-2]
# 1
c中可以这样组织,unsigned char strbuf[120] = {0xA5,0xC3,0x00,0x00,0x00,0x00};那delphi呢???
wspdelphi at 2007-10-21 > top of Msdn China Tech,Delphi,网络通信/分布式开发...
# 2
说白了就是这个数组怎么声明(那种类型),怎么赋值(将16进制原封不动的赋进去),别告诉我声明成字符串数据啊
wspdelphi at 2007-10-21 > top of Msdn China Tech,Delphi,网络通信/分布式开发...
# 3
A5 C3 00 00 00 00 41 42 43 44 A5 99

var
sendbuf:array of byte;

setlength(sendbuf,12);
sendbuf[0]:=$a5;
sendbuf[1]:=$c3;
sendbuf[2]:=$0;
sendbuf[3]:=$0;
sendbuf[4]:=$0;
sendbuf[5]:=$0;
sendbuf[6]:=$41;
sendbuf[7]:=$42;
sendbuf[8]:=$43;
sendbuf[9]:=$44;
sendbuf[10]:=$a5;
sendbuf[11]:=$99;

这是最笨的办法了。你所讲的数据组织的特点并不明显。如果有明显的规律,可以自己做个函数或是方法什么的就行了。

A5C3 LEN SEQ RAW DATA A599
Flag(2byte) Length(3 byte) Sequence(12byte) Data Flag(2byte)
这是你的指令协议吧。
你可以做一个指令生成的方法啊。
比如,做一个全局的发送缓存区;
var
sendbuffer:array of char;

procedure GetSendCmd(const Senddata:string);//---将数据按字符串格式传入
var
cmdlen,index:integer;
tempstr:string;
begin
cmdlen:=length(Senddata)+17;
setlength(sendbuffer,cmdlen);
zeromemory(sendbuffer,cmdlen);
//---指令头与控制字
sendbuffer[0]:=char($a5);
sendbuffer[1]:=char($c3);
tempstr:=inttohex(cmdlen,3);//--不明白你的指令怎么只有三个字节呢?一般地应为双字节数啊。
//--写Sequence的东西,自己写,我也不明白你要写什么东西。:)
//--写数据内容:
for index:=17 to cmdlen-3 do
sendbufer[index]:=senddata[18-index];

//--指令尾写入
sendbuffer[cmdlen-2]:=char($a5);
sendbuffer[cmdlen-1]:=char($99);

end;

dinglinger-小呆之家 at 2007-10-21 > top of Msdn China Tech,Delphi,网络通信/分布式开发...
# 4
var
sendbuffer:array of char;

procedure GetSendCmd(const Senddata:string);//---将数据按字符串格式传入
var
cmdlen,index:integer;
tempstr:string;
begin
cmdlen:=length(Senddata)+17;
setlength(sendbuffer,cmdlen);
zeromemory(sendbuffer,cmdlen);
//---指令头与控制字
sendbuffer[0]:=char($a5);
sendbuffer[1]:=char($c3);
tempstr:=format('%.3d',[cmdlen]);//--不明白你的指令怎么只有三个字节呢?一般地应为双字节数啊。
//--写入指令长度的数据,你自己根据上面的内容来写吧。
//--写Sequence的东西,自己写,我也不明白你要写什么东西。:)
//--写数据内容:
for index:=1 to cmdlen do
sendbufer[16+index]:=senddata[index];//---呵~~,这是个BUG。自己更正下。:)

//--指令尾写入
sendbuffer[cmdlen-2]:=char($a5);
sendbuffer[cmdlen-1]:=char($99);

end;
dinglinger-小呆之家 at 2007-10-21 > top of Msdn China Tech,Delphi,网络通信/分布式开发...
# 5
正如你所说:我的本意是一个编辑框输入内容,可以有汉字,我想实现转化

procedure TForm_Server_Main.BitBtn1Click(Sender: TObject);
var
data: array of byte;
str: string;
i: integer;
begin
SetLength(data, length(Edit1.Text));
str := Edit1.Text;
for i := 1 to Length(str) do
begin
data[i-1] :=StrToInt(IntToHex(ord(str[i]),2));//这里不支持汉字,能找到更好的转换函数就好了
end;
wspdelphi at 2007-10-21 > top of Msdn China Tech,Delphi,网络通信/分布式开发...
# 6
呵~~,一样的支持汉字啊。你这样取出来的码值就是汉字的GB码啊。一个汉字占用两个字节是对的啊。这并不错啊。呵~~。我不明白:取汉字就不行?
比如:“中”字,它的GB码就是:0xD6D0
用上面的方法取就是正确的。
dinglinger-小呆之家 at 2007-10-21 > top of Msdn China Tech,Delphi,网络通信/分布式开发...
# 7
找到正确答案了:data[i-1] :=StrToInt('$'+IntToHex(ord(str[i]),2));
wspdelphi at 2007-10-21 > top of Msdn China Tech,Delphi,网络通信/分布式开发...
# 8
D6转化成int会溢出的,所以得加$
wspdelphi at 2007-10-21 > top of Msdn China Tech,Delphi,网络通信/分布式开发...