2010-01-29 81 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
相關問題