如何利用CopyMemory()函数把四字节的byte恢复成single?在VB的客户端我是这样做的:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Long, Source As Long, ByVal Length As Long)Dim f1  As Single
Dim tempYC2(4) As Byte
    tempYC2(0) = recTcpData(57)
tempYC2(1) = recTcpData(58)
tempYC2(2) = recTcpData(59)
tempYC2(3) = recTcpData(60)
       
CopyMemory ByVal f1, ByVal tempYC2(0), 4recTcpData 是客户端接收到的数据(recTcpData 和 tempYC2同数据类型)可是得出的f1总是为0或者为空
=======================================================
比如说我在服务器端把18.9转换成char型的四个数E1 A1 02 03,然后这四个数通过网络发出去,客户端接收到了这四个数也是E1 A1 02 03
(比如说recTcpData(57)=E1、recTcpData(58)=A1、recTcpData(59)=02、recTcpData(60)=03),
用什么方法就可以把这四个数恢复成18.9?除了利用CopyMemory()函数之外还有什么办法么?
(在利用CopyMemory()函数过程中,我还碰到VB突然自动关闭的情况,害怕用CopyMemory()函数)服务器端我是这样把浮点数转换成char的:(这是正确的)
static void Changefloat(float val,unsigned char *f1,unsigned char *f2,unsigned char *f3,unsigned char *f4)
{
    *f1 = *(unsigned char *)((unsigned long)&val+3);      
    *f2 = *(unsigned char *)((unsigned long)&val+2);       
    *f3 = *(unsigned char *)((unsigned long)&val+1);      
    *f4 = *(unsigned char *)(&val);      
}为什么我的服务器端要把float转换成char呢,是因为我的网络发送函数是这样定义的:
send( 端口, char s,长度 ,0),发送的数据类型是char

解决方案 »

  1.   

    CopyMemory  f1,  tempYC2(0), 4 
      

  2.   

    多谢大侠,但是有这样两个问题:
    1、CopyMemory ByVal f1, ByVal tempYC2(0), 4中的ByVal 一定要么?2、为什么我断点调试察看f1总是Empty或者NUll?(tempYC2的值是0x00,0x00,0x108,0x66)
      

  3.   

    1、我不是大侠,虽然我很希望能重现哪个时代,可是....
    2、Byval不一定要啊,看是怎么传递参数。byval 按值传递;byref 按地址传递(不加就是按这种方式传递)
    你定义CopyMemory 时:Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Long, Source As Long, ByVal Length As Long)
    Destination 和Source 都没有加byval,所以这是按地址传递,所以,调用CopyMemory 时,也要按地址传递!
    3、断点应设在CopyMemory  f1,  tempYC2(0), 4 的一下句,不然,这一句还没有执行!
      

  4.   

    CopyMemory ByVal VarPtr(f1), ByVal VarPtr(tempYC2(0)), 4
    '如果recTcpData就是Byte数组的话,直接
    CopyMemory ByVal VarPtr(f1), ByVal VarPtr(recTcpData(57)), 4
      

  5.   

    1、太好了,几年没来CSDN,现在来提问,而且还能得到各位大侠忙百之中的的回复,很高兴
    2、断点我是设置在后面的语句的
    3、为什么会出现这样不同的定义?VB 里面都支持吗?
    Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (Destination As Long, Source As Long, ByVal Length As Long)Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
      

  6.   

    我的定义是这样的: 
    Global recTcpData() As Byte             'winsock控件接收数据缓冲