2014-06-25 125 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