尽管不过复制代码 代码如下:string pack ( string $format [, mixed $args [, mixed $...]] ) //Pack given arguments into binary string according to format. array unpack ( string $format, string $data ) //Unpacks from a binary string into an array according to the given format. 其中,$format跟perl里的pack格式类似,有如下一些(中文是我加的,有不准确的欢迎提出):a NUL-padded string,即“”作为“空字符”的表示形式A SPACE-padded string,空格作为“空字符”的表示形式h Hex string, low nibble first,升序位顺序H Hex string, high nibble first,降序位顺序c signed char,有符号单字节C unsigned char,无符号单字节s signed short (always 16 bit, machine byte order)S unsigned short (always 16 bit, machine byte order)n unsigned short (always 16 bit, big endian byte order)v unsigned short (always 16 bit, little endian byte order)i signed integer (machine dependent size and byte order)I unsigned integer (machine dependent size and byte order)l signed long (always 32 bit, machine byte order)L unsigned long (always 32 bit, machine byte order)N unsigned long (always 32 bit, big endian byte order)V unsigned long (always 32 bit, little endian byte order)f float (machine dependent size and representation)d double (machine dependent size and representation)x NUL byte,实际使用的时候作为跳过多少字节用,很有用X Back up one byte,后退1字节@ NUL-fill to absolute position,实际使用的时候作为从开头跳到某字节用,很有用实际使用发现:C里的“”(即字符串终止符)在一开始我用了strpos函数找到“”的位置,然后进行substr截取.不过很Faint的事情发生了,不知道是strpos的bug还是substr的bug(其实测试一下就知道,懒得试),有些字符串没问题,有些字符串却只能得到空值(即$name == ”)。很是郁闷,后来找了个strtok函数,这下没有问题了.难为大家看了那么多,下面写个完整的首先是C的struct定义示例,为了演示,我就写个简单点的,实际对照上面那个$format格式表应该没有问题:复制代码 代码如下:struct BIANBIAN { char name[10]; char pass[33]; int age; unsigned char flag; };比如有个“file.dat”文件,内容就是上面的N个BIANBIAN结构体构成的。读取的复制代码 代码如下: $format = 'a10name/a33pass/iage/Cflag'; //确定一个struct占用多少长度字节,如果只是读取单个结构体这是不需要的 $length = 10 + 33 + 4 + 1; //也可以用fopen + fread + fclose,不过file_get_contents因为可以mmap,效率更高 $data = file_get_contents('file.dat', 'r'); for ($i = 0, $c = strlen($data); $i $bianbian = unpack("$format", $data); //reference传递是 foreach ($bianbian as &$value) { if (is_string($value)) { $value = strtok($value, "\0"); } } print_r($bianbian); } ?> pack应该跟unpack相反。顺便附上生成结构体文件的C语言代码:复制代码 代码如下: #include #include struct example { char name[10]; char pass[33]; int age; unsigned char flag; }; int main() { example test; example read; FILE *fp; test.age = 111; test.flag = 10; strcpy(test.name, "Hello World!"); strcpy(test.pass, "zbl110119"); fp = fopen("file.dat", "w+"); if (!fp) { printf("open file error!"); return -1; } rewind(fp); fwrite(&test, sizeof(example), 1, fp); rewind(fp); fread(&read, sizeof(example), 1, fp); printf("%d, %s\n", read.age, read.name); fclose(fp); return 0; }
08-24 06:46