2015-12-19 119 views
-1

我需要知道下面的Python語句的等效bash語句。將值轉換爲無符號32位

xa = ctypes.c_uint32(a).value 

我覺得這個變量a轉換成32位無符號整數。

基本上我需要將整數值(正值或負值)轉換爲bash中的32位無符號值。

當我在python shell中輸入以下命令時,它給了我相同的值。

ctypes.c_uint32(4029987).value

輸出是

4029987

當I型以下在python外殼命令,它給我的下面的值。

ctypes.c_uint32(-4029987).value

輸出

4294544309

+2

請爲樣本輸入添加樣本輸入和您想要的輸出到您的問題。 – Cyrus

+0

我需要在bash中做同樣的事情...... –

+3

您使用了兩次'ctypes.c_uint32(4029987).value'有不同的結果嗎? – Cyrus

回答

-1

沒有爲以下Python的聲明沒有相應的bash聲明:

xa = ctypes.c_uint32(a).value 

猛砸變量untyped.Unlike許多其他的編程語言, Bash不會按「類型」分隔它的變量。

type本身不存在,你甚至不能想象unsigned type

參考:

TLDP Article on Bash Variables

+0

我可以知道downvote的原因嗎? – sjsam

+0

我不是那個貶低你的人。別人downvoted。我是新蜜蜂 –

+0

@etutionlanka:這是理解朋友! :)無論如何,我希望得到downvote的原因,因爲我害怕如果我有一種誤解 – sjsam

0

如果你想無符號整數轉換成二進制,您可以使用bc

基本十進制到二進制轉換可以這樣

$ echo "obase=2;42" | bc 
101010 

做才能處理是負面的和positiv輸入號碼,只需添加| sed 's/^-//'這將抑制潛在的減號從輸出

最後,如果你真的想打印32位二進制數字我建議你使用這樣的printf

$ printf '%032d' $(echo "obase=2; -42" | bc | sed 's/^-//') 
00000000000000000000000000101010 

享受

0

你所用xa = ctypes.c_uint32(a).value在Python是a十進制值asigning到xa假設a是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中不起作用。

+0

'xa = $(printf'%08x'「 - $ a」)'yield'bash:printf:--4029987 :'a = -4029987'的無效號碼。 – Armali

+0

'xa = $ {xa%????????''爲前面的xa = ffffffffffc281dd產生'ffffffff'。 – Armali

0

這裏的事情是,ctypes的與Signed number in two's complement工作,這意味着每一個負數有其首創位1除其他事項外

這就是爲什麼

>>> 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)) 
0

這工作在相同意義上user2350426的做法,其優點是它確實有效:

a=-4029987 
xa=$(printf %d 0x`printf %x $a | sed 's/.*\(.\{8\}\)/\1/'`) 

順便說一句,該示例值的正確輸出爲4290937309,而不是如所述的4294544309

相關問題