2016-11-18 8 views
-2

私はbase64文字列を他の型(integer、float、char配列)に変換したいと思います。string base64からinteger/float/char配列をPHPで

は、Javaでは、私はByteBufferオブジェクトを使用することができますので、stream.getInt()stream.getLong()stream.getChar()stream.getFloat()など

しかし、どのようにPHPでこれを行うのが好きな方法で値を取得するのは簡単ですか!

編集:私はbase64-decode PHP関数を試しましたが、この1つは文字列をデコードし、数字をデコードしたいと思います。

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; 

ディスプレイ0base64_decode('AAGdQw==')が印刷可能ではないので。

+3

あなたがこれまで何を試してみましたか?マニュアル、特に[base64_decode](http://php.net/manual/en/function.base64-decode.php)と[型ジャグリング](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) 

山車がA作成pack -function、で再組み立てすることができバイト配列からの変数。

しかし、データ型とその基礎となるハードウェアの両方に注意を払う必要があります。特にプロセッサのエンディアン(バイトオーダー)とプロセッサのワードサイズ(32ビットintは64ビットintとは異なります) - したがって、可能であれば、JSONのようなテキストベースのプロトコルを使用する必要があります。これはベース64エンコード、あまりにも。

0

内容をそのままデコードし、結果をまたはsettype()のようなvarialbe handling functionのいずれかのタイプにキャストします。

符号化ファイルが大きく、メモリ消費が心配な場合は、stream filtersrelevant 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

関連する問題