【问题标题】:java writeInt from php,来自 php 的 java writeInt,
【发布时间】:2010-07-25 04:26:23
【问题描述】:

嘿,我正在尝试在 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)

【问题讨论】:

  • 您采用这种方式而不是使用中间数据传输(如 JSON、WDDX 或普通的旧 XML)是否有特殊原因?
  • 是的,我有一个网络协议机制,我和朋友很久以前用 java 实现了,我更喜欢这个协议
  • 知道了很奇怪....我让我的示例工作我写了 3 个不同的 int 值,它看起来很好我必须做的是忽略我正在阅读的前 2 个字节,可以吗?一帮我为什么?我现在更新关于我如何发送字节的帖子

标签: java php outputstream


【解决方案1】:

Php 具有pack() 函数,用于将数据转换为二进制形式。 Unpack() 反转操作。

$binaryInt = pack('I', $v);

【讨论】:

  • 我的方法在我在发送之前打印要记录的值时起作用,只是将数据存储为二进制数据并发送它对我不起作用。我尝试使用 pack 但这不会帮助回显数据在 java 中有奇怪的值在 php 中打印它们看起来不错所以我猜这只是二进制的东西
  • @shay - 你是如何在 Java 中“回响”的?如果读取为字节并转换/打印为字符串,我不希望二进制数据可读。
  • @jmz 我使用 pach('c' ,$v) ,工作得很好我现在有另一个问题
  • *pack 工作得很好,我的新问题是为什么我总是从 php 端读取 \r\n
  • @Shay:我很抱歉,但我不太理解你从 php 端读取 \r\n 的意思吗?当您期望其他内容或实际字符串 backslash-r-backslash-n 时,您是否收到 CRLF?
【解决方案2】:

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

编辑

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

【讨论】:

  • 只是试图将其强制为一些二进制数据。原始数据有通用的内容类型吗?
  • 我试过这个头(“内容类型:应用程序/八位字节流”); header("内容传输编码:二进制");没有帮助查看我对以前帖子的评论
  • @shay - 哦,好吧。但无论如何你都需要修复它。否则,任何关注内容类型标头的客户端(例如浏览器)都会尝试将响应视为 ZIP 文件!
  • 嘿,谢谢 Stephen C,我能够将字节数据回显到 java,使用 java DataInputStream 读取数据类型,但我必须读取前两个字节才能开始读取原始数据类型,在我回显 php 之前,我看到我的数组长度是 4,在 java 端我需要读取前 2 个字节,然后读取 INT(即 4 个字节)
  • 我也更新了我在做什么的问题,我正在阅读的 4 个字节是 DatainputStream.readInt() 的源代码;
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多