2014-10-06 72 views
2

我想读一些字节值。此命令如何读取一个字节的数值?

printf '\x00\x01\x02' | how 

应打印:

0 
1 
2 

我尝试这样做:

printf '\x00\x01\x02' | while read -rN1 BYTE ; do echo "?" ; done 

,但我不知道如何获得该字节的数值。

+0

问题似乎是'\ 00'被视为终止符。 – ams 2014-10-06 09:42:27

+0

@ams是的,我也这么认为。愚蠢的C字符串。我必须改变我的例子。 – ceving 2014-10-06 10:00:26

回答

5

使用printf而不是echo

printf '\x01\x02' | while read -rN1 BYTE ; do printf '%d' "'$BYTE" ; done 

通知在参数前述$BYTEprintf到单引号;告诉printf打印字符的ASCII值,而不是字符本身。

+1

+1,用于'''$ BYTE''的简单使用,但它不适用于'printf'\ x00 \ x01 \ x02'' – anubhava 2014-10-06 14:02:47

+1

在v4.2和v4.3之间, 'read'处理输入中的NUL,这可能(无意中)影响'读-N1'。自从4.3开始,'NULs'就被忽略了,除非它们恰好是行分隔符。然而'read -N'忽略了分隔符,所以现在没有例外; 'NULs'总是被忽略。从这我得出结论,chepner使用bash-4.2而@anubhava升级到bash-4.3。但是有一个版本可以同时适用于这两个版本:'while IFS = read -d''-rn1 BYTE;实际上,它们是' – rici 2014-10-06 21:10:56

+1

4.3。但是,我在回答中只是回避了空字节的整个问题,专注于字符到ASCII的转换。很高兴知道各种版本的'bash'如何处理空字节。 – chepner 2014-10-06 23:09:34

相关问题