如何从四个字节到一个单精度数?

时间:2023-01-11 17:54:46
本来是一组单精度数,但从设备读来却成了一组字符,不但有乱码,而且是两个字节组成的unicode字符。怎么才能把它变成我需要的四个字节一个单精度数呢?

7 个解决方案

#1


不要用字符串类型的变量来接收。
另外,可以如下处理:

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Dim rcvArr(3) As Byte
Dim myVal As Single

...
CopyMemory myVal As Single, rcvArr(0) As Byte, 4 

#2


同意用CopyMemory

#3


Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

 dim x as Single
   A数组是你从设备读出的数据,single占4字节,所以使用以下函数是
   从a(0) 的内存地址开始读取4字节到变量x中!
   CopyMemory x,a(0),4
 

#4


同意of123() 的做法,不过要是在读取的时候再加个类型转换函数,郊果可能要保险一点。

#5


同意楼上的

直接用Byte数组接收数据,再用CopyMemory复制内存数据

#6


大家说的不错,不过我还有几个疑问:
1、我其实可以用一个for循环一个个读single数据(有一百多个),但这样速度很慢,我整体把它读回来,在内存里分,这样速度怎么样?
2、我用的是winsock中的getdata,它怎么才能把一串字节传给一个字节数组呢?

我的水平不高,希望大家不吝赐教!

#7


getdata 也可以直接存到数组中。本质上,字符串和字节数组是一样的,都是地址指针所指向的一块缓冲区。在 VB 中仅仅对它的后台处理不同而已。

不过在 VB 中,字节数组与 Single 的转换与 C 中不同,还是需要 CopyMemory 。

#1


不要用字符串类型的变量来接收。
另外,可以如下处理:

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Dim rcvArr(3) As Byte
Dim myVal As Single

...
CopyMemory myVal As Single, rcvArr(0) As Byte, 4 

#2


同意用CopyMemory

#3


Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

 dim x as Single
   A数组是你从设备读出的数据,single占4字节,所以使用以下函数是
   从a(0) 的内存地址开始读取4字节到变量x中!
   CopyMemory x,a(0),4
 

#4


同意of123() 的做法,不过要是在读取的时候再加个类型转换函数,郊果可能要保险一点。

#5


同意楼上的

直接用Byte数组接收数据,再用CopyMemory复制内存数据

#6


大家说的不错,不过我还有几个疑问:
1、我其实可以用一个for循环一个个读single数据(有一百多个),但这样速度很慢,我整体把它读回来,在内存里分,这样速度怎么样?
2、我用的是winsock中的getdata,它怎么才能把一串字节传给一个字节数组呢?

我的水平不高,希望大家不吝赐教!

#7


getdata 也可以直接存到数组中。本质上,字符串和字节数组是一样的,都是地址指针所指向的一块缓冲区。在 VB 中仅仅对它的后台处理不同而已。

不过在 VB 中,字节数组与 Single 的转换与 C 中不同,还是需要 CopyMemory 。