@WebAirStudio

Как fread в PHP бинарного файла созданного в С++?

Есть бинарный файл данных, генерируемый с помощью C++. И читается с помощью C++ нормально.
Хочу прочитать с помощью PHP, но что то идет не так.

Сам файл, если интересно пощупать.
Если открыть с помощью Notepad++ видно, что char как текст, а остальное не видно.
63c86c0593c2b369428378.jpeg
Как данные сохраняются в C++

void ServerClass::SaveStat() {
	FILE* fil;

	fil = fopen("stat.dat", "wb");
	if (fil == NULL) return;

	std::vector<PlayerStat>::iterator it;
	PlayerStat* tps;
	tps = (PlayerStat*)calloc(1, sizeof(PlayerStat));

	for (it = PS.begin(); it != PS.end(); it++) {
		if (it->Name[0] != 0) {
			strcpy(tps->Name, it->Name);
			tps->Rating_All = it->Rating_All;
			tps->Wins_All = it->Wins_All;
			tps->Loses_All = it->Loses_All;
			tps->Disc_All = it->Disc_All;
			tps->REP_All = it->REP_All;
			tps->OppsREP_All = it->OppsREP_All;
			tps->OppsRating_All = it->OppsRating_All;
			tps->Rating_Circ = it->Rating_Circ;
			tps->Wins_Circ = it->Wins_Circ;
			tps->Loses_Circ = it->Loses_Circ;
			tps->Disc_Circ = it->Disc_Circ;
			tps->REP_Circ = it->REP_Circ;
			tps->OppsREP_Circ = it->OppsREP_Circ;
			tps->OppsRating_Circ = it->OppsRating_Circ;
			tps->Rating_Sprint = it->Rating_Sprint;
			tps->Wins_Sprint = it->Wins_Sprint;
			tps->Loses_Sprint = it->Loses_Sprint;
			tps->Disc_Sprint = it->Disc_Sprint;
			tps->REP_Sprint = it->REP_Sprint;
			tps->OppsREP_Sprint = it->OppsREP_Sprint;
			tps->OppsRating_Sprint = it->OppsRating_Sprint;
			tps->Rating_Drag = it->Rating_Drag;
			tps->Wins_Drag = it->Wins_Drag;
			tps->Loses_Drag = it->Loses_Drag;
			tps->Disc_Drag = it->Disc_Drag;
			tps->REP_Drag = it->REP_Drag;
			tps->OppsREP_Drag = it->OppsREP_Drag;
			tps->OppsRating_Drag = it->OppsRating_Drag;
			tps->Rating_Drift = it->Rating_Drift;
			tps->Wins_Drift = it->Wins_Drift;
			tps->Loses_Drift = it->Loses_Drift;
			tps->Disc_Drift = it->Disc_Drift;
			tps->REP_Drift = it->REP_Drift;
			tps->OppsREP_Drift = it->OppsREP_Drift;
			tps->OppsRating_Drift = it->OppsRating_Drift;

			fwrite(tps, 1, sizeof(PlayerStat), fil);
		}
	}

	fclose(fil);
};


Как данные в C++ читаются из файла

void ServerClass::LoadStat() {
	FILE* fil;

	fil = fopen("stat.dat", "rb");

	if (fil == NULL) return;

	PlayerStat* tps;

	while (!feof(fil)) {
		tps = (PlayerStat*)calloc(1, sizeof(PlayerStat));
		fread(tps, 1, sizeof(PlayerStat), fil);
		if (tps->Name[0] != 0) {
			PS.push_back(PlayerStat(tps->Name,
				tps->Rating_All, tps->Wins_All, tps->Loses_All, tps->Disc_All, tps->REP_All, tps->OppsREP_All, tps->OppsRating_All,
				tps->Rating_Circ, tps->Wins_Circ, tps->Loses_Circ, tps->Disc_Circ, tps->REP_Circ, tps->OppsREP_Circ, tps->OppsRating_Circ,
				tps->Rating_Sprint, tps->Wins_Sprint, tps->Loses_Sprint, tps->Disc_Sprint, tps->REP_Sprint, tps->OppsREP_Sprint, tps->OppsRating_Sprint,
				tps->Rating_Drag, tps->Wins_Drag, tps->Loses_Drag, tps->Disc_Drag, tps->REP_Drag, tps->OppsREP_Drag, tps->OppsRating_Drag,
				tps->Rating_Drift, tps->Wins_Drift, tps->Loses_Drift, tps->Disc_Drift, tps->REP_Drift, tps->OppsREP_Drift, tps->OppsRating_Drift));
		}
	}
	fclose(fil);
};


Структура данных в C++

struct PlayerStat {
	char Name[16];
	int Rating_All;
	int Wins_All;
	int Loses_All;
	int Disc_All;
	int REP_All;
	int OppsREP_All;	// average opponents REP
	int OppsRating_All;	// average opponents Rating
	int Rating_Circ;
	int Wins_Circ;
	int Loses_Circ;
	int Disc_Circ;
	int REP_Circ;
	int OppsREP_Circ;
	int OppsRating_Circ;
	int Rating_Sprint;
	int Wins_Sprint;
	int Loses_Sprint;
	int Disc_Sprint;
	int REP_Sprint;
	int OppsREP_Sprint;
	int OppsRating_Sprint;
	int Rating_Drag;
	int Wins_Drag;
	int Loses_Drag;
	int Disc_Drag;
	int REP_Drag;
	int OppsREP_Drag;
	int OppsRating_Drag;
	int Rating_Drift;
	int Wins_Drift;
	int Loses_Drift;
	int Disc_Drift;
	int REP_Drift;
	int OppsREP_Drift;
	int OppsRating_Drift;


В php пытаюсь так прочитать

<?php

$file = fopen("stat.dat", "rb");
  
$seq = fread($file, 4);
echo $seq;

while(!feof($file)){
	fseek($file, 4, SEEK_CUR);
	$seq = fread($file, 4);
	echo $seq."<br>";
}

fclose($file);


Получается не очень...
63c86bbfa4703862972712.jpeg
C С++ я сталкивался только в универе, но смысл кода понимаю.
А с php работаю часто, но бинарные данные не читал до этого. Может и не бинарные это, я уже сомневаюсь :)
  • Вопрос задан
  • 213 просмотров
Решения вопроса 3
mayton2019
@mayton2019
Bigdata Engineer
Вот в stackoverflow пишут https://stackoverflow.com/questions/38859621/readi...
Ответ написан
Комментировать
Adamos
@Adamos
Вы читаете из файла бинарные данные и зачем-то пытаетесь вывалить их на страницу.
Понятно, что получается "не очень".
Если это записанные в файл 4-байтные целые, так используйте unpack, например, чтобы собрать это целое прежде, чем его выводить.
Ответ написан
Комментировать
@WebAirStudio Автор вопроса
Всё решилось использованием библиотеки BinaryStream
Она сделала почти всё за меня :)
Результат

63c8b21b30394359640948.jpeg


Спасибо всем за ценные советы!
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽