目标是从Angular 7向PHP发出一个HTTP请求(空),以接收Angular中的二进制数据以供protobuf3使用。 更具体地说,PHP(源代码)中的二进制数据(编码如下:https://developers.google.com/protocol-buffers/docs/encoding)封装在字符串中,而Angular中的目标是Uint8Array。
因此,我目前有以下工作代码:
PHP代码(一个简单的ProcessWire根模板):
header('Content-Type: application/b64-protobuf');
…
echo base64_encode($response->serializeToString());
角度:
let res = this.httpClient.get(`${this.API_URL}`, { responseType: 'text' });
res.subscribe((data) => {
let binary_string = atob(data);
let len = binary_string.length;
let bytes = new Uint8Array(len);
for (let i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
let parsedResponse = pb.Response.deserializeBinary(bytes)
})
如您所见,在发送数据之前,我将数据编码为base64。因此,它不如可能有效,因为base64减少了每个字符的信息量。我已经做了很多尝试来使二进制传输正常工作,但是最终数据总是被破坏,即变量bytes
与base64_encode
的参数不同。
但是,根据某些消息来源(例如PHP write binary response,Binary data corrupted from php to AS3 via http(没有人说这是不可能的)),
所以我的问题是:直接传输二进制数据必须更改什么?甚至有可能吗?
我尝试了什么?
header('Content-Type:binary/octet-stream;');
或在Angular中使用Blob。base64_encode
和atob
从角度代码。结果:数据的内容在serializeToString
和deserializeBinary(bytes)
之间修改,这是不希望的。<?php
之前的可能字符规格:
如果需要更多信息,请在评论中让我知道。我渴望提供它。谢谢。