2014-06-25 56 views
2

使用灰,我有一個IP地址作爲變量Linux的shell:寫IP二進制文件

IP_ADDR=192.168.1.234

我想寫的4個字節的二進制文件,後來重讀他們和改革IP字符串。

我有以下的工作解決方案,但它似乎很hacky - 任何更好的建議?

寫:

IP_ADDR=192.168.1.234 
serialHex=`printf '%02X' ${IP_ADDR//./ } | sed s/'\(..\)'/'\\\\x\1'/g` 
echo -n -e $serialHex | dd bs=1 of=/path/to/file seek=19 &> /dev/null 

注尋求= 19表示其中在二進制文件(在字節19)寫

閱讀:

hexValues=`od -j 19 --read-bytes=4 --address-radix=n -t x1 /path/to/file` 
set $hexValues 
for w; do echo -n "$((0x$w))."; done | sed s/.$// 
+0

*「Note seek = 19 ...'* - 今天你不在乎,但如果你想要一個C程序讀取這個文件,那麼你應該提前計劃並將這個32位值對齊一個32位對齊(例如,使用字節偏移20)。應該對齊多字節二進制數據以便於讀入數據結構,尤其是在RISC拱門上。 – sawdust

回答

1
function ip_write { 
    local FILE=$1 IP=$2 NUMS T 
    IFS=. read -a NUMS <<< "$IP" 
    printf -v T '\\x%x\\x%x\\x%x\\x%x' "${NUMS[@]}" 
    printf "$T" > "$FILE" 
} 

function ip_read { 
    local FILE=$1 NUMS 
    read -a NUMS < <(exec od -N4 -An -tu1 "$FILE") 
    local IFS=. 
    IP="${NUMS[*]}" 
} 

實例:

# Saves IP to file: 
> ip_write ip.txt 10.0.0.1 
> hexdump -C ip.txt 
00000000 0a 00 00 01          |....| 

# Reads IP from file: 
> ip_read ip.txt 
> echo "$IP" 
10.0.0.1 
+0

這似乎並不適用於灰燼。我試圖修復,但它在ip_write()中的第一個printf上給我「語法錯誤:錯誤替換」。另外,如何在二進制文件的特定位置寫入數據? – Philipp

+0

確保你用Bash運行腳本:'bash script.sh'。請不要將Bash混淆爲Shell本身。 Bash是一個具有更多功能的sh變體。我不確定在一個二進制文件的特定位置上如何做到這一點,但這不再是在你的問題的背景下,所以也許最好再提一個關於它的問題。 – konsolebox

+0

請記住,如果我問你正在使用什麼版本的Bash? ('bash --version') – konsolebox