如何将原始二进制数据从PHP脚本传递到JavaScript ArrayBuffer?

时间:2016-06-10 13:06:17

标签: javascript php

假设我有一个PHP脚本,其中包含一堆二进制数据,需要在JavaScript中处理客户端。

<?php
$binary_data = file_get_contents( "file.data" );
?>

我有一个JavaScript函数,用于从ArrayBuffer处理它:

<script type="text/javascript">
function processData( arrayBuffer ) {
...
}
</script>

直接传递它不会起作用,因为它的二进制数据因此无法正常工作:

<?php

$binary_data = file_get_contents( "file.data" );

echo <<<EOF

<script type="text/javascript">

var binaryData = '{$binary_data}';

processData( binaryData );

function processData( arrayBuffer ) {
...
}
</script>

EOF;

?>

如何在单页加载中将PHP变量$ binary_data传递给JavaScript变量ArrayBuffer?

1 个答案:

答案 0 :(得分:0)

我刚刚将数据转换为base64,然后在我的代码中使用它。我想也许我也可以直接创建一个数组缓冲区并用数字字节初始化它,但这最终会在HTML中变得更长。我认为base64将是基于这篇文章(Base64: What is the worst possible increase in space usage?)“最便宜”的字节数。

然后我需要将base64直接转换为ArrayBuffer。我找到了这个小宝石(https://gist.github.com/borismus/1032746),我根据自己所做的修改了一点。

最终代码(基于原文):

<?php

$binary_data = base64_encode( file_get_contents( "file.data" ) );

echo <<<EOF

<script type="text/javascript">

var binaryData = base64ToArrayBuffer( '{$binary_data}' );

processData( binaryData );

/**
 * Process the binary data ArrayBuffer
 */
function processData( arrayBuffer ) {
...
}

/**
 * Convert a base64 string to an ArrayBuffer
 */
function base64ToArrayBuffer( base64 ) {
    var raw = window.atob( base64 );
    var rawLength = raw.length;
    var array = new Uint8Array( new ArrayBuffer(rawLength) );

    for( i = 0; i < rawLength; i++ ) {
        array[ i ] = raw.charCodeAt( i );
    }
    return( array.buffer );
}

</script>

EOF;

?>