2010-01-29 84 views
1

我在C++中实现一个PHP程序时遇到了问题。它关于PHP/Perl函数unpack。我不知道如何在C++中执行下列操作(读取文件时没有问题......但是如何解开(“C *”)读取的内容)。如何在C++中处理来自Perl/PHP的打包数据?

<?php 
$file = fopen("bitmaskt.dat", "rb"); 
//create the data stream 
$matrix_x   = unpack("C*", fread($file, 286)); 
$matrix_y   = unpack("C*", fread($file, 286)); 
$mask_data   = unpack("C*", fread($file, 286)); 
$reed_ecc_codewords = ord(fread($file, 1)); 
$reed_blockorder = unpack("C*", fread($file, 128)); 
fclose($file); 
?> 

目前,我很无望解决我自己的这个问题 - 我搜索了好几天,我都发现有问题...有任何免费的解压()C++实现了吗? :-(

回答

1

我不知道关于C++的任何一般执行解压,但似乎并没有被你总有需要的东西。

如果matrix_x某处定义为unsigned char matrix_x[286]和你有一个打开输入流​​ 那么你需要做的是inFile.get(matrix_x, 286)。这从输入读取286个字节,并将其放置在阵列中指向matrix_x

+0

^h我的立方体, thx为您的答案,但然后有位于'matrix_x'的二进制“废话”,而不是数字,因为我会通过解包(“C *”)在PHP和Perl中获取它们。 “bitmaskt.dat”是在Perl中用pack(“C *”)创建的。 我尝试了一下,将'matrix_x'的每个元素类型化为'long int'似乎与PHP的解压缩(“C *”)具有相同的效果 - 任何人都可以证实这一点? – Georg 2010-01-29 17:48:12

+0

我不太明白你是如何铸造这些数字的。你能展示那部分C++代码吗? – cube 2010-01-30 08:35:41

2

Perl的documentation for pack涵盖用于packunpack模板。

说你产生bitmaskt.dat

#! /usr/bin/perl 

use warnings; 
use strict; 

open my $fh, ">", "bitmaskt.dat" or die "$0: open: $!"; 

my @data = (42) x 286; 

print $fh pack("C*" => @data); 
print $fh pack("C*" => @data); 
print $fh pack("C*" => @data); 
print $fh pack("C" => 7); 
print $fh pack("C*" => (1) x 128); 

close $fh or warn "$0: close"; 

您可能会

#include <fstream> 
#include <iostream> 
#include <iterator> 
#include <vector> 

typedef unsigned char datum_t; 
typedef std::vector<datum_t> buf_t; 

std::istream &read_data(std::istream &in, buf_t &buf, size_t n) 
{ 
    std::istreambuf_iterator<char> it(in.rdbuf()), eos; 
    while (it != eos && n-- != 0) 
    buf.push_back(static_cast<datum_t>(*it++)); 

    return in; 
} 

例如阅读:

int main() 
{ 
    std::ifstream bm("bitmaskt.dat", std::ifstream::binary | std::ifstream::in); 

    struct { 
    buf_t buf; 
    size_t len; 
    std::string name; 
    } sections[] = { 
    { buf_t(), 286, "matrix_x" }, 
    { buf_t(), 286, "matrix_y" }, 
    { buf_t(), 286, "mask_data" }, 
    { buf_t(), 1, "reed_ecc_codewords" }, 
    { buf_t(), 128, "reed_blockorder" }, 
    }; 
    const int n = sizeof(sections)/sizeof(sections[0]); 

    for (int i = 0; n - i > 0; i++) { 
    if (!read_data(bm, sections[i].buf, sections[i].len)) { 
     std::cerr << "Read " << sections[i].name << " failed" << std::endl; 
     return 1; 
    } 
    } 

    const int codeword = 3; 
    std::cout << (unsigned int) sections[codeword].buf[0] << '\n'; 

    return 0; 
} 

输出:

7
相关问题