从PHP读取java字节

从PHP读取java字节,java,php,Java,Php,我有一个通过网络发送压缩图像的JAVA应用程序。 每个像素值都转换为新的字节类型。 我的问题是,我不知道如何用PHP正确解码这些字节 以下是JAVA压缩: public byte[]CompressedImage(BufferedImage img,int color\u type){ if((img.getType()!=2)和&(img.getType()!=1)){ 抛出新的RuntimeException(“不支持图像格式”); } int sizeX=img.getWidth();/

我有一个通过网络发送压缩图像的JAVA应用程序。 每个像素值都转换为新的字节类型。 我的问题是,我不知道如何用PHP正确解码这些字节

以下是JAVA压缩:

public byte[]CompressedImage(BufferedImage img,int color\u type){
if((img.getType()!=2)和&(img.getType()!=1)){
抛出新的RuntimeException(“不支持图像格式”);
}
int sizeX=img.getWidth();//640px
int sizeY=img.getHeight();//80px
矢量压缩数据=新矢量(sizeY*(1+3*sizeX)+1);
DataBuffer data=img.getRaster().getDataBuffer();
整数计数=0;
int-nextPix=0;
int-ptr=0;
对于(int y=0;y>16;
int color_G=(currPix&0xFF00)>>8;
int color_B=currPix&0xFF;
add(新字节((字节)((color\R&0xFF)>>1));
add(新字节((字节)((color_G&0xFF)>>1));
compressedData.add(新字节((字节)((color_B&0xFF)>>1));
如果(计数!=0){
add(新字节((字节)(0xFFFFFFC0 |计数));
}
计数=0;
currPix=nextPix;
}而(x++
使用WireShark软件,我已经能够捕获一个包含完整图像的数据包,并将其存储在文件“scalio.bin”中

现在我尝试用PHP读取这个scalio.bin文件,以便重新创建图像。 我知道每个-128值意味着一个新行 我知道我应该能够得到4个值:R,G,B和count

我尝试使用unpack()和sprintf()但没有真正成功:

$filename = "scalio.bin";
$handle = fopen($filename, "rb");
$content = fread($handle, filesize($filename));

/* METHOD 1 */
for ($i=0; $i<strlen($content); $i++){
  $v = sprintf("%d", bin2hex($content[$i]));
  if(hexdec($v) == 128) {
    $line++;
  } else {
    $imgArray[$line][] = hexdec($v);
  }
}

echo "<pre>";
print_r($imgArray);
echo "</pre>";

/* METHOD 2 */
$data  = unpack("c*", $content);
foreach($data as $val){
  switch($val){
    case -128:
      $line++;
      break;
    default:
      $imgArray[$line][] = $val;
  }
}

for($i=0; $i<sizeof($imgArray); $i++){
  $imgArray[$i] = array_chunk($imgArray[$i], 4);
}

echo "<pre>";
print_r($imgArray);
echo "</pre>";
$filename=“scalio.bin”;
$handle=fopen($filename,“rb”);
$content=fread($handle,filesize($filename));
/*方法1*/
为了($i=0;$i我终于得到了它!
但是我对性能不是很满意。你知道如何优化我的代码吗


我错过了下面的Java代码,老实说,我根本看不出这是如何解码的。如果你有一个用Java或其他语言编写的工作解码器,你可能希望以此为基础,如果没有,你应该先用你最熟悉的语言编写解码器。
$filename = "scalio.bin";
$handle = fopen($filename, "rb");
$content = fread($handle, filesize($filename));

/* METHOD 1 */
for ($i=0; $i<strlen($content); $i++){
  $v = sprintf("%d", bin2hex($content[$i]));
  if(hexdec($v) == 128) {
    $line++;
  } else {
    $imgArray[$line][] = hexdec($v);
  }
}

echo "<pre>";
print_r($imgArray);
echo "</pre>";

/* METHOD 2 */
$data  = unpack("c*", $content);
foreach($data as $val){
  switch($val){
    case -128:
      $line++;
      break;
    default:
      $imgArray[$line][] = $val;
  }
}

for($i=0; $i<sizeof($imgArray); $i++){
  $imgArray[$i] = array_chunk($imgArray[$i], 4);
}

echo "<pre>";
print_r($imgArray);
echo "</pre>";
<?php
$filename = "scalio.bin";
$handle   = fopen($filename, "rb");
$content = fread($handle, filesize($filename));

$line=-1;
$imgArray=array();

$arr=array("r", "g", "b");
$color=-1;
function getNextColor(){
  global $arr, $color;
  if($color > 1)
    $color = -1;
  $color++;
  return $arr[$color];
}

$pix=-1;
for ($i=0; $i<strlen($content); $i++){
  $buf   = bin2hex($content[$i]);
  $dec   = hexdec($buf);
  $bytes = (($dec+128)%256) -128;

  if($bytes == -128){
    $line++;
    $pix=-1;
  }elseif($bytes < 0){
    $b = substr(decbin($bytes), -8);
    $imgArray[$line][$pix]['count'] = (bindec($b) ^ 0xC0) + 1;
  }else{
    $col = getNextColor();
    $b = ($bytes & 0xFF) << 1;
    if($col == "r")
      $pix++;
    $imgArray[$line][$pix][$col] = $b;
  }
}

$sizeX = 640;
$sizeY = 80;
$gd = imagecreatetruecolor($sizeX, $sizeY);

$imgArrayTrue=array();
foreach($imgArray as $lineIndex=>$line){
  foreach($line as $pixelIndex=>$pixel){
    if( array_key_exists('count', $pixel) ){
      for($x=0; $x<$pixel['count']; $x++){
        $imgArrayTrue[$lineIndex][] = array("r"=>$pixel['r'], "g"=>$pixel['g'], "b"=>$pixel['b']);
      }
    }else{
      $imgArrayTrue[$lineIndex][] = $pixel;
    }
  }
}

foreach($imgArrayTrue as $lineIndex=>$line){
  foreach($line as $pixelIndex=>$pixel){
    $color = imagecolorallocate($gd, $pixel['r'], $pixel['g'], $pixel['b']);
    imagesetpixel($gd, $pixelIndex, $lineIndex, $color);
  }
}

header('Content-Type: image/gif');
imagegif($gd);
?>