Python3中如何将接收的double值解码为对应字符串?
问题
我需要实现这样的功能:把字符串对应的内存地址转成double值传输,再将接收到的double值解码回原字符串。已经用C语言实现了该功能:
C语言发送端(TX)
char name[6] = "me123";//对应的十进制地址值为2127182692 send((double)(long)name);
C语言接收端(RX)
double rx_val = receive(); char *new_string = (char*)(long)rx_val ; printf("the string %s \n", new_string );
但在Python3里没法实现接收端的解码逻辑,试了相关代码都报错,请问该怎么实现?
解决方案
先明确核心逻辑:C代码本质是把字符串的内存指针(整数)强制转成double类型发送,接收后再转回指针读取字符串。Python没有直接的指针操作,得通过字节转换+内存操作库ctypes来实现:
实现步骤与代码
import struct import ctypes # 替换为实际接收到的double值 rx_double = 2127182692.0 # 1. 将double转成字节,再解析回原指针地址(整数) # 注意字节序:x86/AMD64系统用小端格式'<d',大端系统用'>d' double_bytes = struct.pack('<d', rx_double) # 64位系统用'<Q'(无符号长整型),32位系统替换为'<I'(无符号整型) ptr_address = struct.unpack('<Q', double_bytes)[0] # 2. 通过ctypes从内存地址读取字符串 # 将地址转为C风格字符指针 str_pointer = ctypes.c_char_p(ptr_address) # 读取并解码字符串,根据实际编码调整(比如ascii) result_string = str_pointer.value.decode('utf-8') print(f"the string {result_string}")
关键注意事项
- 必须保证Python与C代码运行在同一进程/共享内存空间,否则直接访问陌生内存地址会导致崩溃(不同进程的内存地址是独立的)。如果是跨进程/网络传输,这种用指针的方案不可行,应该直接传输字符串的字节数据。
- 字节序要与C端系统一致:多数PC用小端(
<),嵌入式或大型机可能用大端(>)。 - 32位与64位系统要对应调整
struct的格式符:32位用I,64位用Q。
内容的提问来源于stack exchange,提问作者SamL
相关产品推荐
相关产品推荐

