2015-04-20 2 views
3

Если бы я запускал этот PHP-код на машине с большим энтузиазмом, что бы я получил?PHP-последовательность байтов целых чисел на аппаратах большого конца.

$v = 0x12345678; 
for ($i = 0 ; $i < 4 ; $i++) { 
    echo "$i: " . dechex(($v>>($i*8))&0xff) . "\n"; 
} 

было бы "А":

0: 78 
1: 56 
2: 34 
3: 12 

или это будет "B":

0: 12 
1: 34 
2: 56 
3: 78 

Я спрашиваю, как в то время как настольные компьютеры почти всегда мало младшему , и PHP всегда использует внутреннее представление аппаратного обеспечения (на самом деле это один из наиболее проблемных недостатков), он все еще печатает «A», который по существу является большим аргументом в пользу того, что я помню.

+2

* что я получу? * Почему бы просто не попробовать? – Rizier123

+2

Может быть, у него нет и маленькой, и большой эндианской машины? – Med

+0

Точно @Med У меня есть только мой рабочий стол, который немного велик. –

ответ

0

Прежде всего, у меня есть большая компьютерная машина для проверки. Бурт основан на теории, если мы планируем $ v = 0x12345678; в памяти тогда в Littel Endian становится:

byte0: 78 Байт 1: 56 byte2: 34 байт 3: 12

Но в большой Endian становится:

byte0: 12 Байт 1: 34 byte2: 56 byte3: 78

Итак, вы должны увидеть A на маленьком endian и B на большом endian.

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

+0

htons не является функцией PHP, PHP предоставляет функцию, называемую pack, которая может сделать то же самое. Но, как я уже упоминал в комментарии выше, я думаю, что я коротко замыкаю свой вопрос, поскольку я на самом деле не смотрю на память. Независимо от базовой архитектуры код, который я предоставил, всегда будет возвращать «A», поскольку я по существу делит на 256 и маскирую младший байт. –

Смежные вопросы