将浮点数的字节表示附加到 python 字节数组
Appending the byte representation of a float to a python bytearray
我正在使用 python 和 ctypes 来读取字节数组并将其存储在 python 字节数组中。然后将该数组作为 UDP 数据包传输。
我想将时间附加到这个字节数组,并且相信这样做的方法是:
t = time.time()
其中 returns 一个 python 浮动。然后找到它存储在内存中的位置,并提取代表浮点数的字节数组(4 或 8,我不确定),并将这些字节附加到我现有的 bytearray。
感谢收到由字节数组构成的 UDP 数据包时间戳的任何建议。
我的最小代码如下:
class Host:
def __init__(self):
self.data = (ctypes.c_ubyte * 4112)()
self.data_p = ctypes.byref(self.data)
self.byte_data = bytearray(4120)
self.t = (ctypes.c_ubyte * 8)()
self.t_p = ctypes.byref(self.t)
self.t = time.time()
self.Data_UDP_IP = "127.0.0.1"
self.Data_UDP_PORT = 8992
self.DataSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
def genBytearray(self)
<function that fills self.data with actual data>
data = ctypes.cast(self.data_p, ctypes.POINTER(ctypes.c_ubyte))
self.t = time.time()
t_cast = ctypes.cast(self.t_p, ctypes.POINTER(ctypes.c_ubyte))
self.byte_data[0:4112] = data[0:4112]
self.byte_data[4112:4120] = t_cast[0:8]
import time
import ctypes
import socket
Host1 = Host()
genBytearray(Host1)
Host1.DataSock.sendto(self.byte_data, (self.Data_UDP_IP, self.Data_UDP_PORT))
问题是,似乎 t_cast 总是等于 0。我想通过调用:
self.t = time.time()
我实际上并没有把时间写到self.t_p指向的位置。坚持了一段时间,不禁想到有一种更简单的方法。我遇到过 struct.pack,但是 python 似乎在我尝试使用它时崩溃了。
万一有人无意中发现了这个:
t = (ctypes.c_double * 1)(time.time())
tnew = ctypes.cast(t, ctypes.POINTER((ctypes.c_uint8 * 8)))
tnew.contents[0:8]
提取由 time.time() 返回的 64 位双精度值的 uint8 表示。
我正在使用 python 和 ctypes 来读取字节数组并将其存储在 python 字节数组中。然后将该数组作为 UDP 数据包传输。
我想将时间附加到这个字节数组,并且相信这样做的方法是:
t = time.time()
其中 returns 一个 python 浮动。然后找到它存储在内存中的位置,并提取代表浮点数的字节数组(4 或 8,我不确定),并将这些字节附加到我现有的 bytearray。
感谢收到由字节数组构成的 UDP 数据包时间戳的任何建议。
我的最小代码如下:
class Host:
def __init__(self):
self.data = (ctypes.c_ubyte * 4112)()
self.data_p = ctypes.byref(self.data)
self.byte_data = bytearray(4120)
self.t = (ctypes.c_ubyte * 8)()
self.t_p = ctypes.byref(self.t)
self.t = time.time()
self.Data_UDP_IP = "127.0.0.1"
self.Data_UDP_PORT = 8992
self.DataSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
def genBytearray(self)
<function that fills self.data with actual data>
data = ctypes.cast(self.data_p, ctypes.POINTER(ctypes.c_ubyte))
self.t = time.time()
t_cast = ctypes.cast(self.t_p, ctypes.POINTER(ctypes.c_ubyte))
self.byte_data[0:4112] = data[0:4112]
self.byte_data[4112:4120] = t_cast[0:8]
import time
import ctypes
import socket
Host1 = Host()
genBytearray(Host1)
Host1.DataSock.sendto(self.byte_data, (self.Data_UDP_IP, self.Data_UDP_PORT))
问题是,似乎 t_cast 总是等于 0。我想通过调用:
self.t = time.time()
我实际上并没有把时间写到self.t_p指向的位置。坚持了一段时间,不禁想到有一种更简单的方法。我遇到过 struct.pack,但是 python 似乎在我尝试使用它时崩溃了。
万一有人无意中发现了这个:
t = (ctypes.c_double * 1)(time.time())
tnew = ctypes.cast(t, ctypes.POINTER((ctypes.c_uint8 * 8)))
tnew.contents[0:8]
提取由 time.time() 返回的 64 位双精度值的 uint8 表示。