2

嘿,我正在尝试在 php 中创建一个数据输出流,以将原始数据类型写回 Java 应用程序

我创建了一个将数据写入数组的类(与java一样编写,从java代码复制)

最后我将数组写回客户端。

感觉它工作得不好

例如 writeInt 方法向 java 客户端发送一些错误的值我做得好吗?

谢谢你

这是我的代码

private $buf   = array();


public function writeByte($b) {
  $this->buf[] = pack('c' ,$b);
}

public function writeInt($v) { 
  $this->writeByte($this->shiftRight3($v , 24) & 0xFF);
  $this->writeByte($this->shiftRight3($v , 16) & 0xFF);
  $this->writeByte($this->shiftRight3($v ,  8) & 0xFF);
  $this->writeByte($this->shiftRight3($v ,  0) & 0xFF);

}


private function shiftRight3($a ,$b){
  if(is_numeric($a) && $a < 0){
    return ($a >> $b) + (2<<~$b);
  }else{
    return ($a >> $b);
  }
}


public function toByteArray(){
    return $this->buf;
}

这就是我设置主 php 文件的方式

   header("Content-type: application/octet-stream" ,true);
   header("Content-Transfer-Encoding: binary" ,true);

这就是我返回数据的方式

  $arrResult = $dataOutputStream->toByteArray();
  for ($i = 0 ; $i < count($arrResult) ; $i ++){
     echo $arrResult[$i];
  }

我编辑问题,根据我在java客户端的代码更改似乎我有2个字节要读取开始我总是有13、10,这是\r\n我为什么总是阅读它们?

(在我的测试中,我向 java 客户端发送一个字节,

  URL u = new URL("http://localhost/jtpc/test/inputTest.php");
  URLConnection c = u.openConnection();

  InputStream in =  c.getInputStream();
  int read = 0;
  for (int j = 0; read != -1 ; j++) {
    read = in.read();
    System.out.println("More to read : " + read);
  }
 )

  the output will be ,
   More to read : 13
   More to read : 10
   More to read : 1 (this is the byte i am sending)
4

3 回答 3

3

PHP 具有pack()将数据转换为二进制形式的功能。Unpack()反转操作。

$binaryInt = pack('I', $v);
于 2010-07-25T06:19:10.387 回答
3

让我感到奇怪的一件事是您将内容类型设置为 application/zip,但您似乎没有创建 ZIP 编码的输出流。这是疏忽……还是 PHP 在您不问的情况下为您执行编码?

编辑

根据 RFC 2046,对于内容类型未标准化的二进制数据格式,推荐的内容类型是“application/octet-stream”。还有一种做法是定义名称以“x-”开头的自定义内容子类型(用于实验),但 RFC 2046 表示现在强烈不鼓励这种做法。

于 2010-07-25T06:44:08.593 回答
1

您不需要 shiftRight3() 方法,只需使用 >>,因为您正在屏蔽结果,然后将其转换为 chr()。把它扔掉。

于 2010-07-25T06:14:23.757 回答