2015-06-11 48 views
0

我正在使用bc將長十六進制向量轉換爲二進制。它不會對下面的代碼在我的awk腳本工作,例如:bc不完整地轉換長十六進制數

#!/bin/awk -f 

cmd = "bc <<< \"ibase=16;obase=2;"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"\"" 

result = ((cmd | getline binary_vector) > 0 ? binary_vector : -1) 
close(cmd) 
print "conversion result: " result 

我得到以下的輸出:

conversion result: 11111111111111111111111111111111111111111111111111111111111111111111\ 

這不是完整的結果。 bc不會轉換整個字符串,並用「\」截斷。我怎樣才能轉換整個十六進制數字?

+0

爲什麼'FFF'值未加引號?這不應該在awk引用的字符串中嗎?這也不是一個有效的awk程序。這裏涉及'csh'嗎? –

+0

這裏的問題不是'bc'輸出多行,但你只讀一行? –

+0

這是一個正在運行的awk腳本,我通過csh腳本調用。我只是用一個恆定的十六進制值替換了awk腳本中的列號來構建這個例子。該腳本適用於讓我們說64位十六進制輸入。 –

回答

0

下面的命令使BC返回的1000個字符的二進制串在一行中。

cmd = "BC_LINE_LENGTH=1000 bc <<< \"ibas ...\" 
+0

這應該是一個整數,用於指定數字輸出行中的字符數,其中包括反斜槓和換行符長字符。作爲擴展名,零值禁用多行功能。此變量的任何其他值小於3會將行長設置爲70. – Phylogenesis

+0

我試過BC_LINE_LENGTH = 0。它不會禁用該功能。行長度保持爲70 –

+0

您是否檢查過'man bc'以查看您的版本對該環境變量所說的內容? – Phylogenesis

0

下面是一個awk腳本我從previous answer修改。

#!/usr/bin/awk -f 

{ 
    cnt = split($0, a, FS) 
    if(convertArrayBase(16, 2, a, cnt) > -1) { 

     # use the array here 
     for(i=1; i<=cnt; i++) { 
      print a[i] 
     } 
    } 
} 

    # Destructively updates input array, converting numbers from ibase to obase 
    # 
    # @ibase: ibase value for bc 
    # @obase: obase value for bc 
    # @a:  a split() type associative array where keys are numeric 
    # @cnt: size of a (number of fields) 
    # 
    # @return: -1 if there's a getline error, else cnt 
    # 
function convertArrayBase(ibase, obase, a, cnt,   i, b, c, cmd) { 

    cmd = sprintf("echo \"ibase=%d;obase=%d", ibase, obase) 
    for(i=1; i<=cnt; i++) { 
     cmd = cmd ";" a[i] 
    } 
    cmd = cmd "\" | bc" 

    i = 0 # reset i 
    while((cmd | getline b) > 0) { 
     # if the return from bc is long, check for "\$" and build up c 
     if(b ~ /\\$/) { 
      sub(/\\/, "", b) 
      c = c b 
      continue; 
     } 
     a[++i] = c ? c b : b 
     c = "" 
    } 
    close(cmd) 
    return i==cnt ? cnt : -1 
} 

當腳本被稱爲awkochmod +x awko它可以像運行:

$ echo "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" | ./awko 
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 

腳本試圖在記錄的所有字段的鹼轉化,所以下面也適用:

$ echo "A B C D E F" | ./awko 
1010 
1011 
1100 
1101 
1110 
1111 

注意,該記錄的字段是作爲單獨的行的輸出。輸入文件可以被賦予腳本,而不是回顯。