我需要知道下面Python语句的等效bash语句。
xa = ctypes.c_uint32(a).value
我认为这个变量a
转换为32位无符号整数。
基本上我需要在bash中将整数值(正或负)转换为32位无符号值。
当我在python shell中输入以下命令时,它给了我相同的值。
ctypes.c_uint32(4029987).value
输出
4029987
当我在python shell中输入以下命令时,它给出了以下值。
ctypes.c_uint32(-4029987).value
输出
4294544309
答案 0 :(得分:0)
如果要将无符号整数转换为二进制,可以使用bc
。
基本的十进制到二进制转换可以像这样完成
$ echo "obase=2;42" | bc
101010
要处理negativ和positiv输入数字,只需添加| sed 's/^-//'
即可抑制输出中的潜在减号
最后,如果你真的想要打印32位二进制数字,我建议你像这样使用printf
:
$ printf '%032d' $(echo "obase=2; -42" | bc | sed 's/^-//')
00000000000000000000000000101010
享受
答案 1 :(得分:0)
你在python中使用xa = ctypes.c_uint32(a).value
做的是将a
的十进制值设置为xa
,假设 a
1}}是32位的无符号整数。在许多情况下简称为long(但并非总是如此)。
但是,当您编写ctypes.c_uint32(4029987).value
时,您已经在使用4个字节(长整数)的十进制值。这就是为什么你再次得到4029987的十进制值。
bash的问题(对于这个问题)是bash没有类似的类型概念。 shell中的所有值都是字符串和小数,同时。根据需要转换值。
因此,在bash中,包含小数值4029987的变量可以被指定为(注意没有空格):
a=4029987
你想用它做什么?
知道十六进制值吗?
$ printf '%08x' "$a"
003d7e23
打印该值负数的十六进制表示?
$ printf '%08x' "-$a"
ffffffffffc281dd
那是64位(因为我在64位系统中工作)。了解shell如何使用所需的表示。从文本字符串-4029987
到此十进制数的64位表示。
当然,您可以将值减少到32位值:
$ xa=$(printf '%08x' "-$a")
$ xa=${xa%????????}
$ echo $xa
ffc281dd
并且,该十六进制数字串(ffc281dd)以十进制形式返回:
$ echo $((16#$xa))
4290937309
这恰好与Python中的内容相吻合。但是,再一次,这在shell中不起作用。
答案 2 :(得分:0)
这里的事情是ctypes与Signed number in two's complement一起工作,这意味着每个负数都有其第一位在其中的第一位
这就是为什么
>>> ctypes.c_uint32(-4029987).value
4294544309 # 11111111110000101000000111011101 <-- -4029987
# 00000000001111010111111000100011 <-- 4029987
或
>>> ctypes.c_uint32(-1).value
4294967295 # 11111111111111111111111111111111 <-- -1
# 00000000000000000000000000000001 <-- 1
在内部它做了相当于
的事情number&0xffffffff
如果你想保持相同的幅度而不考虑标志
ctypes.c_uint32(abs(number))
答案 3 :(得分:0)
这与user2350426的方法具有相同的意义,其优点是它确实有效:
a=-4029987
xa=$(printf %d 0x`printf %x $a | sed 's/.*\(.\{8\}\)/\1/'`)
顺便说一下,此示例值的正确输出为4290937309
,而不是4294544309
。
答案 4 :(得分:-1)
以下Python语句没有等效的bash语句:
xa = ctypes.c_uint32(a).value
Bash变量是无类型的。与许多其他编程语言不同, Bash不会将其变量按“类型”隔离。
当type
本身不存在时,您甚至无法想象unsigned type
。
<强>参考:强>