如何把CHAR和DOUBLE的数据一起发给对方.

tmcn 2005-12-19 09:33:41
服务器用C写了个SOCKET的服务端,要求接收的数据是char+double,在DELPHI里怎么把这两种格式的数据同时发给服务器呢
...全文
174 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
小呆之家 2005-12-27
  • 打赏
  • 举报
回复
如果是我,我就用流来发,反正在数据传送时都是16进制数据码:
//---------------------------
//---不好意思,改正一下。#-_-#
//---------------------------
var
temp:tmemorystream;
i:integer;
s:string;

const
ch='1234123412341234';
db=12345.356;

begin

temp:=tmemorystream.create();
try
temp.position:=0;
for i:=1 to length(ch) do
temp.Write(ch[i],1);
s:=FloatToStr(db);
//s:=formatfloat('0.000',db);//----保留三位小数,保留位数可认自己定
for i:=1 to length(s) do
temp.Write(s[i],1);

try
ClientSocket1.Socket.SendStream(temp);
except

end;
finally
freeandnil(temp);
end;

end;
小呆之家 2005-12-27
  • 打赏
  • 举报
回复
如果是我,我就用流来发,反正在数据传送时都是16进制数据码:

var
temp:tmemorystream;
i:integer;
s:string;

const
ch='1234123412341234';
db=12345.356;

begin

temp:=tmemorystream.create();
try
temp.position:=0;
for i:=1 to length(ch)-1 do
temp.Write(ch[i],1);
s:=FloatToStr(db);
//s:=formatfloat('0.000',db);//----保留三位小数,保留位数可认自己定
for i:=1 to length(s)-1 do
temp.Write(s[i],1);

try
ClientSocket1.Socket.SendStream(temp);
except

end;
finally
freeandnil(temp);
end;

end;
tmcn 2005-12-27
  • 打赏
  • 举报
回复
楼上的两种方法都试了,都不行啊,郁闷
C语言里是这么写的:
void CMy63_s1_clientDlg::OnBtnSend()
{
CString strTemp;
int nchar;
GetDlgItem(IDC_BACK)->GetWindowText(strTemp);
nchar=atoi(strTemp);
if( nchar>255||nchar<0)
{
AfxMessageBox("协议号在0---255之间");
return ;
}
data.chNumProtocal=nchar;
GetDlgItem(IDC_SEND_NUM)->GetWindowText(strTemp);
data.dbDouble=atof(strTemp);
m_socket.Send(&data,sizeof(data),0);

}

在头文件里规定:
static struct RecData
{
unsigned char chNumProtocal;
double dbDouble;
}DATA;

public:
RecData data;


也是定义个CHAR DOUBLE然后发的,
我只能把CHAR发对,DOUBLE就发不对了,发什么都是出来个-92559631349317831000000000000000000000000000.000000000
Q287413288 2005-12-19
  • 打赏
  • 举报
回复
implementation

{$R *.dfm}
type
TSendData = packed Record
vChar:string[10];
vData:Double;
end;

//转换TSendData到内存
function TSendDataToString(AData:TSendData):string;
begin
SetLength(Result,Sizeof(AData));
Move(AData,Result[1],Sizeof(AData));
end;

//
function StringToTSendData(AData:string):TSendData;
begin
Move(AData[1],Result,Length(AData));
end;

//发送数据
var
SD:TSendData;
buff:string;
begin
SD.vChar := 'ABCDEFG';
SD.vData := 1001.929;
//打包数据
S := TSendDataToString(SD);
//发送数据
Socket.Send...

//接收

var
SD:SD:TSendData;
// S收到的数据包
SD := StringToTSendData(S);

ywx2008 2005-12-19
  • 打赏
  • 举报
回复
看看服务器要求的数据传输格式,按格式把两个数据组合成一个字符串发送过去,就行了。
zsjzwj 2005-12-19
  • 打赏
  • 举报
回复
这个代码写到窗口的这句前面就行了
type
senddate : record
vchar : char(10);
vdouble : double;
end;

type
TQryPrintQFFrm = class(TpubworkFormfrm)

使用的时候象其它类型一样使用
var
vsenddata : senddata;
begin
vsenddata.vchar := '0123456789;
vsenddata.vdouble := 0.01;
end;
zsjzwj 2005-12-19
  • 打赏
  • 举报
回复
或者 senddate : record Package

上面的长度会变化大于18个字节,下面的这个长度不会变char(10)10个字节,double8个字节,共18个字节
tmcn 2005-12-19
  • 打赏
  • 举报
回复
怎么自定义呀,我是个小白啊,可以写个比较完整的好吗
zsjzwj 2005-12-19
  • 打赏
  • 举报
回复
type
senddate : record
vchar : char(10);
vdouble : double;
end;

用自定义类型传

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧