2013-08-28 104 views
0

我想要创建一个BASH脚本,它可以通过单词读取二进制文件,单词(32位),并将该单词传递给一个名为devmem的应用程序。打印出二进制文件内容的Bash脚本,一次只能显示一个单词,没有xxd

现在,我有:

... 
for ((i=0; i<${num_words}; i++)) 
do 
    val=$(dd if=${file_name} skip=${i} count=1 bs=4 2>/dev/null) 
    echo -e "${val}" # Weird output... 
    devmem ${some_address} 32 ${val} 
done 
... 

$ {} VAL有一些怪异(ASCII?)格式的字符表示,看起来像一个问号钻石。

如果我取代 “VAL =” 行:

val=$(dd ... | xxd -r -p) 

我得到我想要的输出。

使用BASH复制xxd功能的最简单方法是什么?

注:我正在开发一个嵌入式Linux项目,其中的要求不允许我安装xxd。 (dd - > binary word - > devmem)而不是(hexdump - > file,parse file - >)这个脚本是性能驱动的,如果我在我的方法中错了,请纠正我的错误,但是因为这个原因,我选择了dd-> binary word-> devmem) devmem)。不管最终目标的最佳路线如何,这个练习都给了我一些麻烦,我非常感谢有人帮我弄清楚如何做到这一点。

谢谢!

+0

如果输入文件是二进制文件,我希望'$ val'有一个“怪异”的外观,如果你做了'echo $ val',因为'$ val'会直接从文件中获得二进制信息, 'echo'会显示它,就好像它们是ASCII码一样(无论它们是否可打印)。所以我不确定为什么用'xxd -r -p'(它做一个反向十六进制转储 - 采用ASCII十六进制并给二进制 - 与我以为你会想要的相反)为您提供了所需的结果。 – lurker

回答

0

正如我看到你不应该使用'|'或回声,因为它们都是ASCII工具。相反,我认为'>'可以为你工作。
我觉得devmem是bash函数或别名,所以我会尝试这样的事:

for ((i=0; i<${num_words}; i++)) 
do 
    dd if=${file_name} skip=${i} count=1 bs=4 2>/dev/null 1> binary_file 
# echo -e "${val}" # Weird output... 
    devmem ${some_address} 32 $(cat binary_file) 
done 

“作为猫只是catenates字节流,它也可以用来连接二进制文件,其中它只会连接字节序列。“wiki

或者你可以改变devmem接受文件作为输入......我希望这会有所帮助!

相关问题