Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将值转换为无符号32位_Python_Bash_Shell_Awk - Fatal编程技术网

Python 将值转换为无符号32位

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

我需要知道下面Python语句的等效bash语句

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/'`)