用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(也可能是其他)。但我不知道怎么进行组织,帮帮我吧,急啊!
c中可以这样组织,unsigned char strbuf[120] = {0xA5,0xC3,0x00,0x00,0x00,0x00};那delphi呢???
说白了就是这个数组怎么声明(那种类型),怎么赋值(将16进制原封不动的赋进去),别告诉我声明成字符串数据啊
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;
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;
正如你所说:我的本意是一个编辑框输入内容,可以有汉字,我想实现转化
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;
呵~~,一样的支持汉字啊。你这样取出来的码值就是汉字的GB码啊。一个汉字占用两个字节是对的啊。这并不错啊。呵~~。我不明白:取汉字就不行?
比如:“中”字,它的GB码就是:0xD6D0
用上面的方法取就是正确的。
找到正确答案了:data[i-1] :=StrToInt('$'+IntToHex(ord(str[i]),2));