我的C#代码使用BinaryWriter编写这样的二进制文件:
writer.Write(Encoding.ASCII.GetBytes("MAGIC")); //5 ascii characters
writer.Write(version.ToString()); // could be any System.Version.ToString(): "1.2.3.4" or "1.2" or "1.1.1.11", etc
writer.Write(hash); // byte[20]
writer.Write(signature); // byte[256]
// etc.
在PHP中,我试图阅读它。现在我正在这样做:
$myfile = fopen("private/test.txt", "r+") or die("Unable to open file!");
echo fread($myfile,5); // read/print the magic file identifier
// problem start
$versionLength = ?????;
//problem end
$versionString = fread($myfile,$versionLength);
.....
据我了解,BinaryWriter将为字符串加上LEB128格式的可变大小值。如何从二进制文件读取此长度,以便可以读取正确的字符串长度?我想我可以在Google上找到一些东西,然后搜索Stack Overflow,但是我没有运气。我尝试了unpack变量,但没有成功。
好吧,我的同事写了一个方法为我做这件事,这里是:
function ReadVarInt($file) {
$val = 0;
$bits = 0;
while ($bits != 35) {
$n = ord(fread($file, 1));
if ($n === FALSE) return FALSE;
$val |= ($n & 0x7F) << $bits;
$bits += 7;
if (!($n & 0x80))
return $val;
}
//error "Too many bytes in what should have been a 7 bit encoded Int32.";
return FALSE;
}
function ReadString($file) {
$len = ReadVarInt($file);
if ($len === FALSE) return FALSE;
if ($len < 0) {
//error "Negative String Length";
return FALSE;
}
return fread($file, $len);
}
只需这样调用:
$myfile = fopen($filename, "r+") or die("Unable to open file!");
$string = ReadString($myfile);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句