首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用perl解码文件中的二进制八进制字符串

用perl解码文件中的二进制八进制字符串
EN

Stack Overflow用户
提问于 2022-07-14 07:14:30
回答 3查看 108关注 0票数 1

我有一个文件,其中一些行包含一个编码为text ->二进制-> octets的数字,我需要对其进行解码才能得到数字。该编码字符串所在的所有行都以STRVID开头:

例如,我有一句台词:

代码语言:javascript
复制
STRVID: SarI3gXp

如果我做这个回波"SarI3gXp“\ perl -lpe‘$_=unpack”B*“,我会得到二进制数

代码语言:javascript
复制
0101001101100001011100100100100100110011011001110101100001110000

现在,为了从二进制解码为octets,我这样做(将前面的命令分配给变量,然后将二进制转换为octets )。

代码语言:javascript
复制
variable=$(echo "SarI3gXp" | perl -lpe '$_=unpack"B*"') ; printf '%x\n' "$((2#$variable))"

结果是数字,而不是正确的顺序。

代码语言:javascript
复制
5361724933675870

要得到前一个数字的正确顺序,我必须得到每一对数字,首先,第二个数字,然后第一个数字,最后得到我想要的数字。就像这样:

代码语言:javascript
复制
variable=$(echo "SarI3gXp" | perl -lpe '$_=unpack"B*"') ; printf '%x\n' "$((2#$variable))" | gawk 'BEGIN {FS = ""} {print $2 $1 $4 $3 $6 $5 $8 $7 $10 $9 $12 $11 $14 $13 $16 $15}'

最后,我找到了我要找的号码:

代码语言:javascript
复制
3516279433768507

对于我的文件中以STRVID:开头的每一行,我都不知道如何自动做到这一点。最后,我需要的是整个文件,但是当一行以STRVID开头时:则需要解码的值。

当我发现这个:

代码语言:javascript
复制
STRVID: SarI3gXp

我会在我的档案里

代码语言:javascript
复制
STRVID: 3516279433768507

有人能帮忙吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-14 14:06:08

首先,转换所需的全部条件是

代码语言:javascript
复制
unpack "h*", "SarI3gXp"

使用-p的perl一行程序将为每一行执行所提供的程序,而s///e允许我们修改以代码作为替换表达式的字符串。

代码语言:javascript
复制
perl -pe's/^STRVID:\s*\K\S+/ unpack "h*", $& /e'

将要处理的文件指定为Perl一行

票数 2
EN

Stack Overflow用户

发布于 2022-07-14 09:39:47

请查看以下示例演示代码片段,以了解是否符合您的问题。

当可以一次完成时,不需要双重转换。

注意:请阅读pack文档,拆包使用相同的模板

代码语言:javascript
复制
use strict;
use warnings;
use feature 'say';

while( <DATA> ) {
    chomp;
    /^STRVID: (.+)/
        ? say 'STRVID: ' . unpack("h*",$1) 
        : say; 

}

__DATA__
It would be nice if you provide proper input data sample
 
STRVID: SarI3gXp

Perhaps the result of this script complies with your requirements.

To work with real input data file replace

while( <DATA> ) {

with 

while( <> ) {

and pass filename as an argument to the script.

输出

代码语言:javascript
复制
It would be nice if you provide proper input data sample

STRVID: 3516279433768507

Perhaps the result of this script complies with your requirements.

To work with real input data file replace

while( <DATA> ) {

with

while( <> ) {

and pass filename as an argument to the script.

./script.pl input_file.dat

票数 0
EN

Stack Overflow用户

发布于 2022-07-14 09:17:22

您可以完全通过regex (也不需要反向引用)交叉翻转数字:

Variable=$(回声"SarI3gXp“\ perl -lpe‘$_=unpack’B*‘);printf '%x\n’”$(2#$variable))“{{e76f} mawk -F'^$‘’gsub(”.“,"_&=&_") + gsub(\”(^x 0-9_)(_0-9 x$)“,_)+gsub("=",_)^_‘’

代码语言:javascript
复制
 1  3516279433768507

这样做的目的是在另一边复制一个副本,如下所示:

_53=53__61=61__72=72__49=49__33=33__67=67__58=58__70=70_

然后擦掉剩菜,因为你现在想要的数字是锚定每个等号的两边("=")。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72976624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档