一个浮点数传输的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 yyy_fcz
  • 开始时间 开始时间
Y

yyy_fcz

Unregistered / Unconfirmed
GUEST, unregistred user!
我想把一个浮点数(double)氨字节顺序放入一个buf,再发送到它机上,接收后再转为浮点数应用,却总不成功,那位大哥有好办法没有?
 
我想把一个浮点数(double)氨字节顺序放入一个buf,再发送到它机上,接收后再转为浮点数应用,却总不成功,那位大哥有好办法没有?
 
把浮点数转换成阶码+尾数的形式发送,接收后再把收到的数转换成浮点数
 
这个问题很严重,而其中最严重的问题是zxdcyl的回答:
1. 我很早就看到了yyy_fcz提出的这个问题, 其实问题很简单, 说明yyy_fcz对计算机基础
理论和编程都不熟悉, 对网络传输也不熟悉;
2. 计算机中的数据其实本没有自己是什么类型分别的, 而是我们要怎么去看它们(我这样
说可能还是有点晦涩, 但能理解的人自然理解, 希望不理解的人要也能慢慢理解);
3. 网络传输过程中, 其实本质上也不管你要传输的东西是什么, 网络传输只关心你传输的
的数据量的大小(多少)和速度;
4. 对这个问题的回答: 一个double(8个字节)可以直接传输和接收的, 所有的数据本来
都是可以直接传输的(除非特殊需要(例如加密等)), 一般都不需要什么转换;
在Delphi中, 可以这样操作: // 下面写的只是通用的模式(形象描述)
var dx : double; // 定义
tcpsocket.sendbuffer(@dx, sizeof(dx)); // 发送
......
// 在接收的程序中, 也可以这样写
var dx : double; // 定义
tcpsocket.receivebuffer(@dx, sizeof(dx)); // 接收
-----------------------------------------------------------------------------
5. 我想说的是最严重的问题是: 对一个问题如果不太懂或者没有明确的答案, 不要凭自己
的感觉去执导问问题的人, 这样虽然是好心, 但实际上是在坑害别人;
 
谢谢zxdcyl,不过我是要一次传输多个浮点数,不知该如何传输?
 
谢谢天河流星,不过我是要一次传输多个浮点数,不知该如何传输?
就是将多个浮点数放入到一个内存区中,再传输,却总是错误!
 
把多个浮点数放在一个浮点数组中(如果浮点数的个数是不确定的,那就用动态数组,然后在传输的时候需要额外多传一个数组长度),传输整个数组就是了
在接收端,用同样的数组接收(如果是不定长度的数组,那么需要先根据传过来的数组长度去动态创建一个数组,然后在接收)
 
var
a:Array of PSingle;
f:Psingle;
begin
SetLength(A,1);
new(f);
A[0] := @f;
//传输A
end;
 
楼上说的不对吧,A中保存的全是指针,传送到对方,这个指针就没有意义了
LZ要一次传多个分散的浮点数,那不可避免要产生内存复制(将分散存放的浮点数保存到一个顺序的地方,然后一次性传出去)
var
a:Array of Double;
f1:Double;
f2:Double;
f3:Double;
begin
SetLength(A, 3);
A[0] := f1;
A[1] := f2;
A[2] := f3;
//传输A,
//获取被传输内容的首地址的方式是@A[0]
//获得要传输的内容的总长度的方式: 3 * SizeOf[Double]
end;
 
还是 天河流星 说的好
建议LZ先看看基础的知识,例如什么是浮点数,什么是整数,什么是数组,什么是动态数组等等,以及他们在内存中的布局是怎样的。
 
唉,想不到还要讨论这个问题,希望yyy_fzc继续努力啊:
0. 上面的hupeh犯一个和zxdcyl一样严重的错误: 并没有正确理解数据的真正含义,
hupeh的指针引用是错误的, 要传送的数据, 而hupeh传送的是指针...;
1. 如果你的浮点数是简单的一个类型(或者一个属性), 你可以使用数组, 传送和接收的
时候都直接使用数组变量, 可以不用@取地址, 因为数组作为变量在函数传递中本身就
使用的是地址, 例如:
vda : array[1..1000] of double;
count : integer; // 实际要传输的浮点数据的个数;
// 发送方
sock.sendbuffer(@count,sizeof(integer)); // 告诉对方, 要传送多少个浮点数给你
sock.sendbuffer(vda, count * sizeof(double));
....
// 接收方
sock.readbuffer(@count, sizeof(integer));
sock.readbuffer(vda, count * sizeof(double));

2. 如果使用的是零散的浮点数,或者还有其他的数据, 可以使用结构(记录);
type mydatatype = record
va : double;
vb : double;
vc : integer;
end;
var mydata : mydatatype;
...
sock.sendbuffer(@mydata, sizeof(mydatatype);
..
sock.readbuffer....一样
 
天河流星已经说得太详细了。
我就是这样做的,不需要考虑存储细节,只管传送记录块就可以了。当然CS都要用相同的记录结构。
 
谢谢大家,谢谢天河流星!
 

Similar threads

回复
0
查看
978
不得闲
S
回复
0
查看
738
SUNSTONE的Delphi笔记
S
S
回复
0
查看
730
SUNSTONE的Delphi笔记
S
后退
顶部