pack и unpack объясните пожалуйста

  • Автор темы Dr.Death
  • Дата начала

Dr.Death

Guest
pack и unpack объясните пожалуйста

Здравствуйте, просьба не отсылать меня на другие темы с подобным содержанием, т.к. с ними я ознакомился. Привидите пожалуйста мне пример перевода строки в ее байтовое представление и запись в файл с последующей ее извлечением из файла и отображении в исходном виде.
С Уважением.
 

ys

отодвинутый новичок
А бывают строки в НЕ байтовом представлении?
Пример в студию.
 

Demiurg

Guest
>А бывают строки в НЕ байтовом представлении?
конечно, написаные на бумаге и не отсканеные.
 

Dr.Death

Guest
Ну что вы цепляетесь, вообще я и так знаю, что строки тоже имеют байтовое представление, но когда я записываю просто строку в файл, то у меня файл в финде просматривается как текстовый, а мне нужен бинарный.
 

Winer

Мимо проходил
а ты его открывай как бинарный и радуйся, hex-viewer каким-нибудь

-~{}~ 07.06.04 16:59:

перевода строки в ее байтовое представление и запись в файл с последующей ее извлечением из файла и отображении в исходном виде.
позвольте поинтересоваться, а какой глубинный смысл заключен в этом ???
 

Dr.Death

Guest
Код:
<?
$string = "Hello";
$string = strtobin($string);
$string = pack("ix",$string);//получаем бинарное значение
/* Закомментировано, потому что файл уже получил бинарный
$f = fopen("test.bin","w");
fwrite($f,strlen($string).$string);
fclose($f);
*/
$f   = fopen("test.bin","rb");//пробуем извлечь
$cnt = fread($f,1);
$str = fread($f,$cnt);
$x = unpack("c",$str);
foreach($x as $key=>$value) echo $value;//должно посимвольно вывестись hello
fclose($f);
function bintostr($string)
{
for($i = 0;$i <= $string;$I++)
{
$chr = chr($string[$i]);
$str.=$chr;
}
return $str;
}
function strtobin($string)
{
for($i = 0;$i <=strlen($string);$i++)
{
 $byte = ord($string[$i]);
 $result.=$byte;
}
return $result;
}
?>
Ладно вопрос ставлю по другому, почему мне посимвольно не выводится hello
 

Winer

Мимо проходил
а ты не пробовал делать так:
PHP:
<?
$str='hello';
foreach($str as $k=>$v)
{
     echo $v;
};
?>
я думаю такой вопрос не возник бы.
учись отлаживать скрипты а не бегать на форум
 

Dr.Death

Guest
А смысл каков

Из твоего поста я не вижу разности в том, как я вывожу и как ты? Пробовал как ты, выводит -1.
 

Winer

Мимо проходил
вот и я не вижу разницы, однако у меня оно выводит варнинг - Warning: Invalid argument supplied for foreach()ю
Как ты думаешь почему ???о, точно, в foreach нельзя строки использовать в качестве аругмента, вот беда.
кстати, на период отладки обычно ставят error_reporting(E_ALL)
 

Dr.Death

Guest
Ну что, трудно что-ли привести пример создания бинарного файла, записи в него строки и ее чтение?
 

Winer

Мимо проходил
PHP:
<?
$str='hello'
$fp=fopen('file.bin','wb');
fwrite($fp,$str,strlen($str));
fclose($fp);
$fp=fopen('file.bin','rb');
$binstr=fread($fp,filesize('file.bin'));
fclose($fp);
echo $binstr;
?>
вот например так

-~{}~ 07.06.04 18:08:

устроит ???
 

Dr.Death

Guest
Это не то, что мне надо, file.bin это оказывается простой текстовый файл, ты посмотри содержимое файла после работы данного скрипта, запись у меня получается, а вот как извлечь данные?
Код:
<?
$string = "Hello";
$string = strtobin($string);
$string = pack("ix",$string);
$f = fopen("test.bin","w");
fwrite($f,strlen($string).$string);
fclose($f);
function strtobin($string)
{
for($i = 0;$i <=strlen($string);$i++)
{
 $byte = ord($string[$i]);
 $result.=$byte;
}
return $result;
}
?>
:(
 

Winer

Мимо проходил
ты просто ответь, а зачем тебе нужно так хранить строку ???почему ты не можешь хранить её как строку ???
 

Dr.Death

Guest
Я думаю, что файл так будет занимать меньше места и работать с ним будет быстрее по производительности, да и вообще для саморазвития.
 

Winer

Мимо проходил
быстрее по производительности
ну да, конечно будет быстрее кучу раз переконвертировать строку перед записью а потом то же самое при чтении, чем просто записать и считать её.
файл так будет занимать меньше места и работать
я конечно плохо представляю себе как работает [m]pack[/m] но я не думаю что она работает как архиватор и вряд ли от этого размер файла станет меньше. Поправьте меня, если ошибаюсь.
 
[offtopic]
Для саморазвития – это хорошо, а за остальное…
В С++, например, можно открыть файл сразу в бинарном виде
PHP:
fopen( “FileName”, “wb” );
И в последствии работать с ним так же, как и с любым другим. Запись и чтение в / из файла происходят автоматически в бинарном виде…
Почему в пхп работа с бинарными файлами осуществляется так криво, может кто знает?
IMXO использование pack и unpack – геморой….
[/offtopic]
 

neko

tеam neko
Dr.Death

во-первых нет никакого "бинарного представления".
файл это набор байт
когда ты строку сохраняешь строку в файл, 1 символ сохранятеся как 1 байт. (мультибайтовые кодировки в данном ответе я опушу)

что делает ord()?
ord() возвращает код символа.
например код пробела это число 32.

что делает твоя доморощенная функция strtobin()
она перебирает посимвольно строку и слепляет коды
чего ты добиться тем самым собираешься?

если тебе нужно уменьшение места пользуйся архиваторами.
и pack() нетрогай, он тут непричем.
 

lucas

Guest
Loshadka

Уясни, что все файлы -- бинарные.

Смотрим [m]fopen[/m]:
Windows offers a text-mode translation flag ('t') which will transparently translate \n to \r\n when working with the file. In contrast, you can also use 'b' to force binary mode, which will not translate your data.
As of PHP 4.3.2, the default mode is set to binary for all platforms that distinguish between binary and text mode.
Так что про PHP можно сказать то же самое:
например, можно открыть файл сразу в бинарном виде

fopen( “FileName”, “wb” );

И в последствии работать с ним так же, как и с любым другим. Запись и чтение в / из файла происходят автоматически в бинарном виде…
 

Dr.Death

Guest
Ну так все равно, с помощью функции pack экономится место, или я не прав.
 

neko

tеam neko
ты не только был неправ, но еще и ничего не понял...
перечитай внимательно что тебе отвечали.

pack и unpack нужны для совсем других вещей
 
Сверху