【发布时间】:2019-04-24 18:58:12
【问题描述】:
我正在尝试在循环中使用 dd 读取二进制文件中的所有其他字节对,但速度非常慢。
我在 BusyBox 嵌入式设备上有一个二进制文件,其中包含 rgb565 格式的数据。每个像素是 2 个字节,我正在尝试读取每个其他像素以进行非常基本的图像缩放以减小文件大小。
整体大小为 640x480,通过循环 dd 与 960 字节块大小,我已经能够读取每隔“行”的像素。但是,即使在我的本地系统上,通过循环使用 2 字节块大小来对剩余的所有其他“列”执行相同的操作也是非常慢。
i=1
while [[ $i -le 307200 ]]
do
dd bs=2 skip=$((i-1)) seek=$((i-1)) count=1 if=./tmpfile >> ./outfile 2>/dev/null
let i=i+2
done
虽然我得到了我期望的输出,但这个方法是不可用的。
是否有一些不太明显的方法可以让 dd 快速复制每隔一对字节?
遗憾的是,我无法控制编译到 BusyBox 中的内容。我对其他可能的方法持开放态度,但我可以使用 dd/sh 解决方案。例如,一个构建省略了 head -c...
感谢所有反馈。我会逐一检查各种建议并查看结果。
【问题讨论】:
-
为什么是
seek=$((i-2))?为什么不简单地seek=2每次都跳过两个字节?你根本不应该增加i;默认情况下,dd会在它停止的地方继续阅读。 (另外,我个人的偏好是使用of=./outfile,而不是重定向标准输出。) -
你能用
perl吗? -
另外,你能用python吗?
-
您知道系统上命令 (
argmax) 的最大参数长度吗?通常你可以通过sysctl -a | grep -i arg找到它 -
没有 perl,没有 python
# sysctl -a | grep -i arg sysctl: error reading key 'net.ipv4.route.flush': Permission denied我可以尝试 seek=2 - 知道它会从停止的地方继续,这肯定会导致更优化的操作。在这种情况下,重定向标准输出只是一个示例。