Я имею двоичную строку с ASCII, как этоReplicate распаковщики Perl в C++
^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^O^@^@^@^@^@^BU -^@^@^@^A^@^@^O^@^@^@^@^@^BÜ -^@^@^@^A^@^@^@^@^@^@^@^@^EÜ?^@^@^@^A^@^@^ @^@^@^@^@^@^Eu?^@^@^@^A^@^@. а^@^@^@^@^@^HAD^@^@^@^A^@^@ .^^ @^@^@^@^@^Häð^@^@^@^A^@^@> < 80>^@^@^@^@^@^KÖ < 80>^@^@^@^A^@^@> < 80>^
Perl код:
#!/usr/bin/env perl
use warnings;
use strict;
use Data::Dumper;
open(INDEX, $ARGV[0]);
binmode(INDEX);
my $buff;
my $ret = read(INDEX, $buff, 4);
my $fragment = unpack 'N', $buff;
$ret = read(INDEX, $buff, 4);
my $timestamp = unpack 'N', $buff;
$ret = read(INDEX, $buff, 8);
my $offset = unpack 'N', $buff;
print "timestamp = $timestamp fragment # $fragment offset = $offset\n";
Выход:
timestamp = 0 fragment # 1 offset = 0
timestamp = 0 fragment # 1 offset = 0
timestamp = 0 fragment # 1 offset = 0
timestamp = 0 fragment # 1 offset = 0
timestamp = 4000 fragment # 1 offset = 187437
timestamp = 4000 fragment # 1 offset = 187437
timestamp = 8000 fragment # 1 offset = 384063
timestamp = 8000 fragment # 1 offset = 384063
timestamp = 12000 fragment # 1 offset = 582896
timestamp = 12000 fragment # 1 offset = 582896
Я хочу повторить вышеуказанную работу, проделанную распаковываем в C++ Как это сделать?
То, что я пытался:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int k;
char buf1[5];
char buf2[5];
char buf3[9];
int i;
char *str;
//Assume str contains the entire binary data
for(int i=0;str[i];)
{
while(k<32)
{
buf1[k]=str[i];
++k;++i;
}
k=0;
while(k<32)
{
buf2[k]=str[i];
++k;
}
k=0;
while(k<64)
{
buf3[k]=str[i];
++k;++i;
}
k=0;
uint32_t a1,b1,a2,b2;
uint64_t a3,b3;
a1=atoi(buf1);
b1=ntohl(a1);
a2=atoi(buf2);
b2=ntohl(a2);
a3=atoi(buf1);
b3=ntohl(a3);
print "timestamp ="<< b2 << "fragment #"<<b1<<" offset ="<<b3<<"\n";
}
return 0;
}
Я хочу, чтобы код C++ выполнял то, что делает скрипт perl! – Ram
1) выясните, что представляет собой каждое из значений байта, 2) прочитайте их, 3) используя идеи из 1, снова соберите их в нужные вам значения времени. Вы можете начать с 'std :: ifstream' для чтения, и я бы предположил, что значения будут в некотором довольно стандартном формате: вы можете, вероятно, прочитать их непосредственно в' uintint32_t' и, возможно, потребуется запустить ['ntohl' ] (http://linux.die.net/man/3/ntohl) над ними. Отправьте свой код ***, когда вы действительно что-то пробовали ***, и люди помогут вам. –
Извините, что я делал. Можете ли вы меня исправить? – Ram