有没有什么可能的情况
ls -l file.txt
Run Code Online (Sandbox Code Playgroud)
显示的字节数与
wc -c file.txt
Run Code Online (Sandbox Code Playgroud)
在一个脚本中,我发现了这两个值的比较。那可能是什么原因?甚至可能有同一个文件的不同字节数吗?
我有一个文件,在文件的开头和结尾都有垃圾(二进制页眉和页脚)。我想知道如何核对这些字节。例如,让我们假设从一开始就有 25 个字节。并且,距离末尾有 2 个字节。
我知道我可以使用 truncate 和 dd,但是 truncate 不适用于流,而且在硬文件上运行两个命令似乎有点笨拙。如果truncate知道文件有多大,可以将文件转换为dd. 或者,如果有更好的方法来做到这一点?
我正在尝试使用dd并打印其偏移量在块设备上找到第一个非零字节(从可选偏移量开始),但我被卡住了。我没有dd在标题中提及,因为我认为可能有比dd这样做更合适的工具,但我认为dd应该是一个好的开始。如果您知道更合适的工具和/或更有效的方法来实现我的目标,那也没关系。
与此同时,我将向您展示我dd在 bash 方面的进展,到目前为止。
#!/bin/bash
# infile is just a temporary test file for now, which will be replaced with /dev/sdb, for instance
infile=test.txt
offset=0
while true; do
byte=`dd status='none' bs=1 count=1 if="$infile" skip=$offset`
ret=$?
# the following doesn't appear to work
# ret is always 0, even when the end of file/device is reached
# how do I correctly determine if dd has reached the end of file/device?
if …Run Code Online (Sandbox Code Playgroud) 示例:我有文件“mybinaryfile”,十六进制内容为:
A0 01 00 FF 77 01 77 01 A0
Run Code Online (Sandbox Code Playgroud)
我需要知道这个文件中有多少个 A0 字节,多少个 01,等等。结果可能是:
A0: 2
01: 3
00: 1
FF: 1
77: 2
Run Code Online (Sandbox Code Playgroud)
有什么方法可以直接在 shell 中进行计数,还是我需要用任何语言编写程序来完成这个特定任务?
我了解任何字符都由一个或多个字节组成。
如果我没记错的话,至少在 *nix 操作系统中,一个字符通常(或完全?)仅由一个字节组成。
字节和字符(至少 *nixwise)有什么区别?
character-encoding special-characters terminology escape-characters byte
如何将不可见标记埋入随机文本行中?这样的标记必须存在,但对于阅读打印在控制台上的文本的人来说,它是不可见的。
我想通过一个不可见的标记来识别这些行,例如,稍后将它们放入或取出。
我试过0x00没有成功。我希望grep在0x00某处打印匹配的行。但这不起作用:
$ echo -e "a\0b" | hexdump -C
00000000 61 00 62 0a |a.b.|
00000004
$ echo -e "a\0b" | grep "a\0b"
Run Code Online (Sandbox Code Playgroud) 从这次讨论中得出:
\n当我有(zsh 5.8,bash 5.1.0)
\nvar="ASCII"\necho "${var} has the length ${#var}, and is $(printf "%s" "$var"| wc -c) bytes long"\nRun Code Online (Sandbox Code Playgroud)\n答案很简单:这是5个字符,占用5个字节。
\n现在,var=M\xc3\xbcller产量
M\xc3\xbcller has the length 6, and is 7 bytes long\nRun Code Online (Sandbox Code Playgroud)\n这表明该${#}运算符计算的是代码点,而不是字节。这在 POSIX 中有点不清楚,他们说它计算“字符”。char通常,如果 POSIX C 中的字符不是八位字节,那么这会更清楚。
无论如何:不错!还好,看到了LANG==en_US.utf8。
现在,
\nM\xc3\xbcller has the length 6, and is 7 bytes long\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x80\x8d\xe2\x99\x80\xef\xb8\x8f has the length 5, and is 17 bytes long\n …Run Code Online (Sandbox Code Playgroud) 当我执行此命令时:
wget --report-speed=type
Run Code Online (Sandbox Code Playgroud)
他们只输入它接受的是bits。它不会有数字、千位/千字节或字节。
帮助页面 ( wget --help) 说:
--report-speed=TYPE Output bandwidth as TYPE. TYPE can be bits.
Run Code Online (Sandbox Code Playgroud)
暗示他们 TYPE可以是别的东西?
我还没有找到哪些选项,以及(如果此选项不这样做)如何强制将速度显示为字节或千字节。
这个问题与 enzotib 对以下问题的回答有关:How can I use Bash to find 2 bytes in a binary file,增加它们的值,并替换?
这将两个字节转换为其十六进制值:
$ echo -n $'\x1b\x1f' | od -tx2
0000000 1f1b
0000002
Run Code Online (Sandbox Code Playgroud)
但是现在,这应该给我十进制值:
echo -n $'\x1b\x1f' | od -tu2
0000000 7963
0000002
Run Code Online (Sandbox Code Playgroud)
但是如果我将十六进制值转换为十进制,它应该是
$ printf "%d" 0x1b1f
6943
Run Code Online (Sandbox Code Playgroud)
这是为什么?我od对十进制输出使用错误吗?
我如何知道文件名的重量有多少字节?只是文件,而不是完整路径。我试过这个:
echo 'filename.extension' | wc -c
Run Code Online (Sandbox Code Playgroud)
这是正确的吗?