2016-03-18 24 views
2

我已經編寫了一個Perl腳本,它接受一個輸入的十六進制值,然後返回二進制等效值。我需要簽名該8位整數並查看有符號整數的值。這個特定的場景似乎沒有在我見過的Perl文檔中介紹過。該腳本粘貼如下:使用Perl腳本來計算8位整數的二進制補碼

#! perl 
    use warnings; 
    print "Enter hexidecimal number:"; 
    chomp ($hexNum = <STDIN>); 
    print $hexNum . "\n"; 
    print join "\n", map { unpack ('B*', pack ('H*',$_)) } split ':', 
    $hexNum; 

這個問題是不一樣的其他項(具體Converting hexadecimal numbers in strings to negative numbers, in Perl,因爲它有一個8位整數專門處理,不能簡單地轉換成十進制

+4

請顯示一些示例輸入和所需的輸出。我不清楚你的意思。 – PerlDuck

+1

這是完全重複的 - 請參閱[a3f](http://stackoverflow.com/users/1257035/a3f)中的鏈接評論。 – zdim

回答

3

的2的補。數$n只是-$n。將結果限制爲8個比特,使用(-$n)&0xff屏蔽掉其餘部分。

+0

我需要打印結果,以便我可以看到翻轉的位。其原因是爲藍牙低功耗信標配置發送負載。例如,我會放入0xEE並查看-18的8位表示。 –

1
#Hex to Binary and check whether it is signed or unsigned. 
print "Enter hexidecimal number:"; 
chomp ($hexNum = <STDIN>); 
print $hexNum . "\n"; 
my $bin_value = sprintf("%08b", hex($hexNum)); 
my $msb = ($bin_value & 0x080); 
if($msb){ 
print "Unsigned Number\n"} 
else { 
print "Signed Number\n";} 

如果要轉換的十六進制在這種情況下爲十進制您需要採用2的補碼,您可以使用-運算符。