Php 从特定位置读取8字节 $filename='301.tdr'; $packetStream=数组( '缓冲区'=>'', '位置'=>'', “大小”=>“ ); $packetStream['buffer']=fopen($filename,'rb'); $packetStream['position']=0; $packetStream['size']=filesize($filename); 而($packetStream['position']

Php 从特定位置读取8字节 $filename='301.tdr'; $packetStream=数组( '缓冲区'=>'', '位置'=>'', “大小”=>“ ); $packetStream['buffer']=fopen($filename,'rb'); $packetStream['position']=0; $packetStream['size']=filesize($filename); 而($packetStream['position'],php,Php,你好, 我想在文件的特定位置读取8字节。但我也希望以二进制读取并以二进制形式获得输出。因为,这个文件不是字符串等。它是一个二进制文件 此代码不适用于我,它返回0。但是我期望5317..除了需要在decodeInt64函数开始时将$packetStream声明为global之外,如果文件包含字节并且要显示它们的数值,则需要使用fread读取它们,然后获取它们的ord。在本例中,我将返回一个数组 $filename = '301.tdr'; $packetStream = array( '

你好,

我想在文件的特定位置读取8字节。但我也希望以二进制读取并以二进制形式获得输出。因为,这个文件不是字符串等。它是一个二进制文件


此代码不适用于我,它返回0。但是我期望5317..

除了需要在
decodeInt64
函数开始时将
$packetStream
声明为
global
之外,如果文件包含字节并且要显示它们的数值,则需要使用
fread
读取它们,然后获取它们的
ord
。在本例中,我将返回一个数组

$filename = '301.tdr';

$packetStream = array(
    'buffer'    => '',
    'position'  => '',
    'size'      => ''
);

$packetStream['buffer'] = fopen($filename, 'rb');
$packetStream['position'] = 0;
$packetStream['size'] = filesize($filename);

while($packetStream['position'] < $packetStream['size']) {
    $groupID = decodeInt64($packetStream['buffer'], $packetStream['position']);
    echo $groupID;
    break;
}

function decodeInt64($stream, $position) {
    fseek($stream, $position);
    $packetStream['position'] += 8;
    return bindec(fgets($stream, 8));
}
函数decodeInt64($stream,$position){
全球$packetStream;
fseek($stream,$position);
$packetStream['position']+=8;
$bytes=fread($stream,8);
$toReturn=array();
对于($i=0;$i<8;$i++){
$toReturn[]=ord($bytes[$i]);
}
返回$toReturn;
}

Its
break
-ing在第一次迭代中。@LawrenceCherone我知道,我只想看到文件的前8个字节。它应该返回5317,但返回0。我不知道其他的结果。。因此,在获得第一个结果后我中断。如果您尝试使用
fread
而不是
fgets
?@FedericoklezCulloca,如果我使用
fread
读取4096字节,它将返回字符串未知字符。我想问题就在这里,我想看到二进制1和0。你必须循环读取字节(按原样,不要触摸它们,即删除
bindec
),然后用
ord
打印(或其他)它们的值,一次一个
function decodeInt64($stream, $position) {
    global $packetStream;
    fseek($stream, $position);
    $packetStream['position'] += 8;

    $bytes = fread($stream, 8);
    $toReturn = array();
    for($i = 0; $i < 8; $i++) {
        $toReturn[] = ord($bytes[$i]);
    }
    return $toReturn;
}