Java написать от PHP, - PullRequest
       6

Java написать от PHP,

2 голосов
/ 25 июля 2010

эй все, что я пытаюсь сделать поток вывода данных в 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)

Ответы [ 3 ]

3 голосов
/ 25 июля 2010

Php имеет pack() функцию для преобразования данных в двоичную форму. Unpack() отменяет операцию.

$binaryInt = pack('I', $v);
3 голосов
/ 25 июля 2010

Одна вещь, которая кажется мне странной, это то, что вы устанавливаете тип контента на application / zip, но вы, похоже, не создаете поток вывода в формате ZIP.Это упущение ... или PHP выполняет кодирование для вас без вашего ведома?

EDIT

Согласно RFC 2046, рекомендуемый тип содержимого для двоичного файлаформат данных, тип содержимого которых не стандартизирован, равен "application / octet-stream" .Существует также практика определения пользовательских подтипов контента с именем, начинающимся с «x-» (для эксперимента), но RFC 2046 говорит, что эта практика сейчас настоятельно не рекомендуется.

1 голос
/ 25 июля 2010

Вам не нужен этот метод shiftRight3 (), просто используйте >>, поскольку вы маскируете результат, а затем превращаете его в chr (). Выбрось это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...