将值转换为无符号32位

时间:2015-12-19 11:25:24

标签: python bash shell awk

我需要知道下面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

5 个答案:

答案 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

<强>参考:

TLDP Article on Bash Variables