За последние 24 часа нас посетили 20284 программиста и 1090 роботов. Сейчас ищут 770 программистов ...

Почему функция pack() возвращает странные символы ?

Тема в разделе "PHP для новичков", создана пользователем machetero, 4 окт 2019.

  1. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Делаю так
    PHP:
    1. <?php
    2. var_dump(pack('n*',1,2));
    В мануале написано, что эта функция должна возвращать бинарную строку, те что-то типа этого '0000 0001'
    У меня возвращает это
    http://prntscr.com/perm35
    http://prntscr.com/permc1
    Что я делаю не так ?
     
  2. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Content-Type пробовал ставить в UTF-8 и ASCII возвращает то же самое
     
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    Нет, имеется в виду строка байт.
    --- Добавлено ---
    Если нужна строка с дв. кодом, см. decbin и т.п.
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    наверное все же utf8 и ascii это кодировки, а не представление в двоичном коде
    а то что нужно -
    PHP:
    1. $var = pack(.....);
    2. echo printf('%b',$var);
     
  5. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    ADSoft в мануале написано строка, у любой строки есть кодировка
     
  6. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    miketomlin если не сложно объясни что такое short тип у этой функции ?
    Вот я взял пример со страницы мануала
    PHP:
    1. <?php
    2. $binarydata = pack("nvc*", 0x1234, 0x5678, 65, 66);
    3. ?>
    В мануале написано это должно возвращать такую последовательность байтов 0x12, 0x34, 0x78, 0x56, 0x41, 0x42
    Он у меня возвращает вот что http://prntscr.com/pev5k7
    Почему в мануале написано что возвращает числа, а у меня возвращает символы ASCII соответствующие этим числам. Это браузер их преобразовал или это pack() на самом деле возвращает их так, а не так, как в примере ?
    Не понятно когда я пытаюсь передать аргументом символ
    PHP:
    1. <?php
    2. var_dump(pack("n", 'a'));
    Он уже возвращает мне это
    http://prntscr.com/pevgl5
    http://prntscr.com/pevgqk
    Таких символов в ASCII нету
    Ещё не понятно что такое HEX-строка.
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    @machetero, она возвращает не символы, а последовательность байт. Так что всё правильно. В мануале дали шестнадцатиричное представление для удобочтения человеком.
    Это строковое представление, а не двоичное. Опять же, для нашего удобства. Машина работает с битами и байтами, которые и возвращает функция.
     
  8. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    mkramer в мануале написано строка, вот я и не понимал. Те short и long - это двоичные данные. Но я так понял эта функция может ещё возвращать и строки, hex-строки какие-то, символы и числа. Это остальные форматы. Правильно я понял ?
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    --

    Она и возвращает. А вот какого фига ты ЭТО выводишь и надеешься увидеть что-то вменяемое, ХЗ.

    Сделай, например, 0x2121, 0x2121 – это вроде восклицательные знаки. Короче таблица ASCII в помощь ;)
    --- Добавлено ---
    См., что понимается в пыхе под строками.
    --- Добавлено ---
    pack нужна, чтобы «паковать» отдельные значения полей в бинарную структуру.
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    @machetero, строка для php - это не только что-то, что ты можешь прочитать.
    PHP:
    1. $str = file_get_contents("http://example.com/picture.png");
    Это тоже строка. Хотя если ты сделаешь echo $str, то увидишь непонятные символы (ну если только бразуеру заголовок, что сейчас будет картинка, не передашь)
     
  11. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    mkramer Спасибо за ваш ответ. Вроде как я начинаю разбираться.