0

python ctypes cast获取空字符串

b是地址

如果b_v.value是普通字符,这是正常的。但是如果b的内容是像“1122001314”这样的十六进制,只要它包含十六进制“00”,结果可能是 1122 001314 应该丢失

现在我想获取所有内容“1122001314”。请给我一些方法谢谢。

代码是:

b_v=ctypes.cast(b,ctypes.POINTER(ctypes.c_char_p))

print binascii.b2a_hex(b_v.value)

例子:

import ctypes
import binascii

va=binascii.a2b_hex('1212273031003535')
tt=ctypes.create_string_buffer(va)
b=ctypes.addressof(tt)
b_v=ctypes.cast(b,ctypes.c_char_p)
print binascii.b2a_hex(b_v.value)

现在结果是:"1212273031"

我想要的结果是"1212273031003535"

4

1 回答 1

2

在行中,tt=ctypes.create_string_buffer(va)您正在从数据(二进制数据)的十六进制表示中构建 string_buffer,这是错误的,因为 c 字符串以第一个 0 值字符结尾。所以你的数据中断了。幸运的是,除了字符串值之外,ctypes 还提供原始数据,因此tt.raw您可以访问原始数据并且可以使用binascii.b2a_hex(tt.raw),但我不确定它是否对您有用。

如果您想运行b=ctypes.addressof(tt)并将地址传递到其他地方,然后从 address by 检索数据b_v=ctypes.cast(b,ctypes.c_char_p),我应该说这是不可能的 string_buffer 类型,因为您的数据不是文本,它是二进制数据,您不能将其存储在 string_buffer然后使用它的地址访问它。

如果你也知道数据的长度,你可以通过知道 b 来检索数据,试试这个:

b, l = ctypes.addressof(tt), len(tt) - 1 # l - 1, because there is one extra byte for terminator NULL

#Somewhere else:
b_v=ctypes.cast(b, ctypes.POINTER(ctypes.c_char * l))
print binascii.b2a_hex(b_v.contents)
于 2012-08-23T07:25:46.297 回答