我在使用C ++实现PHP程序时遇到了问题。它是关于PHP / Perl函数unpack。我不知道如何使用C ++(在读取文件时没有问题......但是如何解压缩(“C *”)读取内容)。
<?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);
?>
目前,我非常无望地自己解决这个问题 - 我正在寻找好几天,我找到的都是问题......那里有没有免费的unpack()c ++实现? :-(
答案 0 :(得分:2)
Perl的documentation for pack
涵盖了pack
和unpack
使用的模板。
假设您使用
生成了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
答案 1 :(得分:1)
我不知道有关c ++解压缩的任何一般实现,但这似乎不是你需要的东西。
如果matrix_x在某处定义为unsigned char matrix_x[286]
并且您有一个打开的输入流inFile
那么你需要做的是inFile.get(matrix_x, 286)
。这将从输入中读取286个字节,并将它们放在matrix_x
指向的数组中。