2016-11-18 2 views
-2

Я хотел бы преобразовать строку base64 в другие типы, то есть целочисленный, float и char.string base64 to integer/float/char array в php

В Java я могу использовать ByteBuffer объект, так что легко получить значение с методами, как stream.getInt(), stream.getLong(), stream.getChar(), stream.getFloat() и т.д.

Но как это сделать в PHP?

Редактировать: Я пробовал функцию PHP base64-decode PHP, но этот декодировать строку, я хочу декодировать числа.

Edit2:

В Java:

import java.nio.ByteBuffer; 
import javax.xml.bind.DatatypeConverter; 

public class Main { 

    public static void main(String[] args) { 
     ByteBuffer stream = ByteBuffer.wrap(DatatypeConverter.parseBase64Binary("AAGdQw==")); 
     while (stream.hasRemaining()) { 
      System.out.println(stream.getInt()); 
     } 
    } 
} 

отображает 105795

Но в PHP:

$nb = base64_decode('AAGdQw=='); // the result is not a stringified number, neither printable 
settype($nb, 'int'); 
echo $nb; 

отображает 0, потому что base64_decode('AAGdQw==') не является печати.

+3

вы пытались что-нибудь до сих пор? возможно, прочитав руководство, особенно о [base64_decode] (http://php.net/manual/en/function.base64-decode.php) и [type juggling] (http://php.net/manual/en/language .types.type-juggling.php)? –

+0

Конечно, я пробовал base64_decode, но я не хочу декодировать строку, я хочу также декодировать целые числа и плавать. – roipoussiere

+0

вот почему я связался со страницей о жонглировании типа. –

ответ

2

вы должны использовать unpack для преобразования декодированной строки в массив байт, из которого затем можно восстановить целое число:

<?php 
$s = 'AAGdQw=='; 
$dec = base64_decode($s); 
$ar = unpack("C*", $dec); 
$i= ($ar[1]<<24) + ($ar[2]<<16) + ($ar[3]<<8) + $ar[4]; 

var_dump($i); 
//output int(105795) 

поплавок может быть повторно собран с pack -функции, который создает переменная из массива байтов.

, но имейте в виду, что вам необходимо проявлять особую заботу обо всех типах данных и базовом оборудовании; в частности, континент (порядок байтов) процессора и размер слова процессора (32 бит int отличается от 64 бит int), поэтому, если это возможно, вы должны использовать текстовый протокол, такой как JSON, который вы можете кодировать base64, слишком.

0

Декодировать содержимое как есть и отличать результат до любого типа через type casting или некоторые varialbe handling function, такие как settype().

Если кодированный файл большой, и вы беспокоитесь о потреблении памяти, вы можете использовать stream filters (relevant answer).

+0

Спасибо. Я попытался, но я не понимаю, почему 'settype (base64_decode ('AAGdQw =='), 'int')' возвращает '1'. – roipoussiere

+0

'settype()' принимает аргумент по ссылке (см. Руководство), поэтому вам нужно назначить результат декодирования переменной и применить 'settype'.Также вы можете использовать ['intval()'] (http://php.net/manual/en/function.intval.php). – Timurib

+0

Работает лучше. Дело в том, что моя строка base64 не содержит строгое целое число, оно содержит само целое: например, 'AAGdQw ==' должно быть '105795', но декодированная строка не может быть напечатана, поэтому я не думаю, что могу использовать это с 'intval()'. См. Мое редактирование. – roipoussiere