如何将整数转换为可变长度字节字符串?
我想将整数(int
或 long
)转换为大端字节字符串。字节串必须是可变长度的,以便仅使用最小数量的字节(前面数据的总长度已知,因此可以推断出可变长度)。
我当前的解决方案是
import bitstring
bitstring.BitString(hex=hex(456)).tobytes()
这显然取决于机器的字节顺序并给出错误结果,因为 0 位是附加的并且没有前置。
有谁知道一种方法可以在不对 int
的长度或字节顺序做出任何假设的情况下做到这一点?
I want to convert an integer (int
or long
) a big-endian byte string. The byte string has to be of variable length, so that only the minimum number of bytes are used (the total length length of the preceding data is known, so the variable length can be inferred).
My current solution is
import bitstring
bitstring.BitString(hex=hex(456)).tobytes()
Which obviously depends on the endianness of the machine and gives false results, because 0 bits are append and no prepended.
Does any one know a way to do this without making any assumption about the length or endianess of an int
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
像这样的东西。未经测试(直到下次编辑)。对于 Python 2.x。假设n> 0.
编辑:经过测试。
如果您不阅读手册但喜欢 bitbashing,而不是
divmod
caper,请尝试以下操作:编辑 2:如果您的数字相对较小,则以下方法可能会更快:
编辑 3:第二种方法不会不要假设 int 已经是 bigendian 了。以下是在臭名昭著的小端环境中发生的情况:
Something like this. Untested (until next edit). For Python 2.x. Assumes n > 0.
Edit: tested.
If you don't read manuals but like bitbashing, instead of the
divmod
caper, try this:Edit 2: If your numbers are relatively small, the following may be faster:
Edit 3: The second method doesn't assume that the int is already bigendian. Here's what happens in a notoriously littleendian environment:
使用
struct
和itertools
的解决方案:我们可以通过使用简单的字符串条来删除
itertools
:甚至删除
struct
使用递归函数:A solution using
struct
anditertools
:We can drop
itertools
by using a simple string strip:Or even drop
struct
using a recursive function:如果您使用的是 Python 2.7 或更高版本,则可以使用
bit_length
方法将长度四舍五入到下一个字节:否则您可以只测试整个字节并在末尾填充零半字节如果需要,开始:
If you're using Python 2.7 or later then you can use the
bit_length
method to round the length up to the next byte:otherwise you can just test for whole-byteness and pad with a zero nibble at the start if needed:
我在一行中重新表述了 John Machin 的第二个答案,以便在我的服务器上使用:
我发现第二种方法(使用位移位)对于大数字和小数字都更快,而不仅仅是小数字。
I reformulated John Machins second answer in one line for use on my server:
I have found that the second method, using bit-shifting, was faster for both large and small numbers, and not just small numbers.