【发布时间】:2016-08-09 20:13:40
【问题描述】:
是否有关于如何读取二进制文件的全面信息?我在 PHP 网站 (http://www.php.net/manual/en/function.pack.php) 上找到了信息,但我很难理解如何处理“typedef struct”和结构使用。
我有一个很长的二进制文件,里面有很多块,每个块都可以用 C 结构来表示。这个 C 结构有各种“typedef 结构”,类似于我在下面提出的:
typedef struct
{
unsigned char Day;
unsigned char Month;
unsigned char Year;
} DATE_OF_BIRTH;
#define USER_TYPE 5
DATE_OF_BIRTH Birth[2];\
编辑:
我在下面有一个结构,这是一个更大结构的一部分
typedef struct FILE_HEADER_tag
{
int Type;
int Version;
unsigned long Model;
unsigned long Number;
int Class;
int TemplateLoaded;
char TemplateName[32];
RTC_TIME_DATE StartTime;
RTC_TIME_DATE CurrentCal;
RTC_TIME_DATE OriginalCal;
TEMPLATE_SETTINGS;
int EndType;
} FILE_HEADER;
typedef struct
{
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Day;
unsigned char Month;
unsigned char Year;
} RTC_TIME_DATE;
二进制文件充满了换行符,我能够解码它的第一行,它返回正确:类型、版本、型号、编号和一个类。我想我还解码了两个 next 变量,但我不确定,因为 StartTime 返回一些乱码。
目前我正在遍历二进制文件中的行并尝试解压缩每一行:
$i = 1;
while (($line = fgets($handle)) !== false) {
// process the line read.
var_dump($line);
if($i == 1) {
$unpacked = unpack('iType/iVersion/LModel/LNumber/iClass/iTemplateLoaded', $line );
}if($i == 2) {
$i++;
continue;
}if($i == 3) {
$unpacked = unpack('C32TemplateName/CStartTime[Second]/CStartTime[Minute]/CStartTime[Hour]/CStartTime[Day]/CStartTime[Month]/CStartTime[Year]', $line);
}
print "<pre>";
var_dump($unpacked);
print "</pre>";
$i++;
if($i == 4) { exit; }
}
【问题讨论】:
-
$unpacked = unpack('15C', $binary_string);? -
php 不提供任何类似结构的东西。您不能将字节直接吸入 php 内存位置,然后开始将该内存视为结构,因为 PHP 的内存内部结构远不如 C 的简单。您可以将所需的所有二进制数据读入字符串,但不能将 C 风格的类似结构的含义应用于该字节序列。