Python 将值转换为无符号32位
我需要知道下面Python语句的等效bash语句Python 将值转换为无符号32位,python,bash,shell,awk,Python,Bash,Shell,Awk,我需要知道下面Python语句的等效bash语句 xa = ctypes.c_uint32(a).value 我认为这个变量a转换成32位无符号整数 基本上,我需要在bash中将整数值正或负转换为32位无符号值 当我在PythonShell中键入以下命令时,它会给我相同的值 ctypes.c_uint324029987.value 输出为 4029987 当我在PythonShell中键入以下命令时,它会给出以下值 c类型c_uint32-4029987.value 输出为 429454430
xa = ctypes.c_uint32(a).value
我认为这个变量a转换成32位无符号整数
基本上,我需要在bash中将整数值正或负转换为32位无符号值
当我在PythonShell中键入以下命令时,它会给我相同的值
ctypes.c_uint324029987.value
输出为
4029987
当我在PythonShell中键入以下命令时,它会给出以下值
c类型c_uint32-4029987.value
输出为
4294544309下面的Python语句没有等效的bash语句:
xa = ctypes.c_uint32(a).value
Bash变量是非类型化的。与许多其他编程语言不同,
Bash不按类型隔离其变量
当类型本身不存在时,您甚至无法想象无符号类型
参考:
如果要将无符号整数转换为二进制,可以使用bc 基本的十进制到二进制的转换可以这样做
$ echo "obase=2;42" | bc
101010
要处理负数和正数输入,只需添加| sed的/^-/',这将抑制输出中的潜在减号
最后,如果您真的想打印32位二进制数,我建议您使用printf,如下所示:
$ printf '%032d' $(echo "obase=2; -42" | bc | sed 's/^-//')
00000000000000000000000000101010
享受使用xa=ctypes.c_uint32a所做的一切。python中的value是将a的十进制值指定为xa,假设a是32位的无符号整数。在许多情况下,只是简单地称为long,但并不总是这样
但是,当您编写ctypes.c_uint324029987.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中也不一样。这里的问题是ctypes可以使用,这意味着每个负数的第一位都是1 这就是为什么
>>> ctypes.c_uint32(-4029987).value
4294544309 # 11111111110000101000000111011101 <-- -4029987
# 00000000001111010111111000100011 <-- 4029987
如果你想保持相同的大小,不管符号是什么
ctypes.c_uint32(abs(number))
这与user2350426的方法在相同的意义上起作用,其优点是它确实起作用:
a=-4029987
xa=$(printf %d 0x`printf %x $a | sed 's/.*\(.\{8\}\)/\1/'`)
顺便说一句,这个示例值的正确输出是4290937309,而不是如前所述的4294544309。请将示例输入和该示例输入的所需输出添加到您的问题中。我还需要在bash中执行相同的操作……您使用了两次ctypes.c_uint324987.value,但结果不同?我无法复制,当我在PythonShell中键入以下命令两次时,您也会说,所以不确定您要问什么对不起。。第二个应该是负价值我不是那个否决你的人。其他人投了反对票。我是新来的bee@etutionlanka:这是可以理解的,朋友!:无论如何,我希望得到否决票的原因,因为我担心如果我有一个错误的概念xa=$printf'%08x'-$a会产生bash:printf:-4029987:a=-4029987的无效数字。xa=${xa%???}会产生上一个xa=ffffffffff c281dd的ffffffff。
ctypes.c_uint32(abs(number))
a=-4029987
xa=$(printf %d 0x`printf %x $a | sed 's/.*\(.\{8\}\)/\1/'`)