在python中不使用结构的整数到字节

在python中不使用结构的整数到字节,python,struct,integer,byte,Python,Struct,Integer,Byte,我需要使用一个运行Python1.5.2+(!!!)的嵌入式系统,并且只有很少的模块。 而且没有可用的“结构”模块。。。 以下是可用模块的列表: marshal imp _main_ _builtin_ sys md5 binascii 是的,就是这样,没有结构模块 所以,我需要创建一个无符号短整数的4字节表示,以发送到串行 对于struct: date = day + month * 32 + (year - 2000) * 512 time = 100 * hour + minute da

我需要使用一个运行Python1.5.2+(!!!)的嵌入式系统,并且只有很少的模块。 而且没有可用的“结构”模块。。。 以下是可用模块的列表:

marshal
imp
_main_
_builtin_
sys
md5
binascii
是的,就是这样,没有结构模块

所以,我需要创建一个无符号短整数的4字节表示,以发送到串行

对于struct:

date = day + month * 32 + (year - 2000) * 512
time = 100 * hour + minute
data = struct.pack(b'HH', date, time)
日期在2字节,时间在2字节,每个人都很高兴


但是,如果不使用“struct”模块,我该怎么做呢?

您可以这样做:

x = 0xabcd

packed_string = chr((x & 0xff00) >> 8) + chr(x & 0x00ff)

您可以这样做:

x = 0xabcd

packed_string = chr((x & 0xff00) >> 8) + chr(x & 0x00ff)

我可以通过将字节列表传递给bytes()来实现这一点:


我可以通过将字节列表传递给bytes()来实现这一点:


这是给你的完整译文

以前

>>> import struct
>>> day = 1; month = 2; year = 2003
>>> hour = 4; minute = 5
>>> date = day + month * 32 + (year - 2000) * 512
>>> time = 100 * hour + minute
>>> data = struct.pack(b'HH', date, time)
>>> data
'A\x06\x95\x01'
>>> data.encode("hex")
'41069501'
之后

>>> data2 = chr(date & 0xFF) + chr((date >> 8) & 0xFF) + chr(time & 0xFF) + chr((time >> 8) & 0xFF)
>>> data2
'A\x06\x95\x01'
>>> data2.encode("hex")
'41069501'
>>>

这是给你的完整译文

以前

>>> import struct
>>> day = 1; month = 2; year = 2003
>>> hour = 4; minute = 5
>>> date = day + month * 32 + (year - 2000) * 512
>>> time = 100 * hour + minute
>>> data = struct.pack(b'HH', date, time)
>>> data
'A\x06\x95\x01'
>>> data.encode("hex")
'41069501'
之后

>>> data2 = chr(date & 0xFF) + chr((date >> 8) & 0xFF) + chr(time & 0xFF) + chr((time >> 8) & 0xFF)
>>> data2
'A\x06\x95\x01'
>>> data2.encode("hex")
'41069501'
>>>


我如果没有至少可用的ctypes,您不知道如何做到这一点。请注意,
struct
本身就是基于这个原因在c中实现的。如果你不能自己写一个c模块,我会认为你运气不好。@Voo:这完全可以用plain实现Python@NiklasTJDs answer创建了一个
PyObject*
,但是,如何获取指向实际数据开头的指针?@Voo:它创建了一个字节字符串,与struct完全相同would@Voo,不,我的答案创建了一个包含二进制数据的字符串,就像struct.packI一样。。如果没有至少可用的ctypes,您不知道如何做到这一点。请注意,
struct
本身就是基于这个原因在c中实现的。如果你不能自己写一个c模块,我会认为你运气不好。@Voo:这完全可以用plain实现Python@NiklasTJDs answer创建了一个
PyObject*
,但是,如何获取指向实际数据开头的指针?@Voo:它创建了一个字节字符串,与struct完全相同would@Voo,不,我的答案是创建一个包含二进制数据的字符串,就像struct.packbytes是内置的最新添加,不适用于此question@TJD:不过,创建字节列表的想法比手工摆弄字节要优雅得多。连接或多或少是一种装饰。Bytes是最近添加到内置的,不适用于此question@TJD:不过,创建字节列表的想法比手工摆弄字节要优雅得多。连接或多或少是一种修饰。我认为将日期/时间转换为指定输出字符串的示例代码对OP更有利。@SeanJohnson,我不打算为OP编写代码。问题的关键是“如何替换struct.pack”?您可以轻松地使用我的机制来实现自己的struct.pack,并将其用于任何目的。@NiklasB。这仅仅是因为它的高度可移植性(对于任何语言)并且不依赖于任何模块,除了已经存在很长一段时间(永远?)的uuu内置uuu.chr之外。。。字节(x)是好的,但不适用于操作。。。另一方面,你的解决方案也很好。。。少一点general@Joran当前位置我都不知道你在说什么。列表,
map
join
至少已经存在了
chr
(事实上它们都是Python 1.0的一部分)。你能解释一下“不那么笼统”是什么意思吗?事实上,我喜欢把更高阶的运算想象成更一般的运算。另外,您是否只是暗示“correct”=“general”=“portable”?我认为将日期/时间转换为指定输出字符串的示例代码对OP更为有利。@SeanJohnson,我不打算为OP编写代码。问题的关键是“如何替换struct.pack”?您可以轻松地使用我的机制来实现自己的struct.pack,并将其用于任何目的。@NiklasB。这仅仅是因为它的高度可移植性(对于任何语言)并且不依赖于任何模块,除了已经存在很长一段时间(永远?)的uuu内置uuu.chr之外。。。字节(x)是好的,但不适用于操作。。。另一方面,你的解决方案也很好。。。少一点general@Joran当前位置我都不知道你在说什么。列表,
map
join
至少已经存在了
chr
(事实上它们都是Python 1.0的一部分)。你能解释一下“不那么笼统”是什么意思吗?事实上,我喜欢把更高阶的运算想象成更一般的运算。另外,你刚才是不是暗示“正确的”==“通用的”==“便携的”?也非常感谢这个解决方案!对于这个解决方案也非常感谢!