我在使用C语言(通过HTTP)发送一些原始字节。目前我的做法如下:
// response is a large buffer
int n = 0; // response length
int x = 42; // want client to read x
int y = 43; // and y
// write a simple HTTP response containing a 200 status code then x and y in binary format
strcpy(response, "HTTP/1.1 200\r\n\r\n");
n += 16; // status line we just wrote is 16 bytes long
memcpy(response + n, &x, sizeof(x));
n += sizeof(x);
memcpy(response + n, &y, sizeof(y));
n += sizeof(y);
write(client, response, n);
在JavaScript中,我可以使用以下代码读取此数据:
request = new XMLHttpRequest();
request.responseType = "arraybuffer";
request.open("GET", "/test");
request.onreadystatechange = function() { if (this.readyState === XMLHttpRequest.DONE) { console.log(new Int32Array(this.response)) } }
request.send();
这将按预期打印[42, 43]
。
但我想知道是否有更优雅的服务器端操作方式,例如:
n += sprintf(response, "HTTP/1.1 200\r\n\r\n%4b%4b", &x, &y);
在这里%4b
是一个虚构的格式说明符,它表示:将那个地址中的4个字节复制到字符串中(它们将是“*\0\0\0”)。是否有像虚构的%4b
这样的格式说明符来执行类似的操作?
sprintf
用于字符串,也就是以\0
结尾的char
数组。因此,它不适用于任意的二进制数据。 - Eugene Sh.memcpy
调用会使你的代码具有端序依赖性。 - jamesdlinContent-Type: application/octet-stream
头部来指示这一点。 - tadmansprintf(line,“%d \ r \ n”,data); write(client,line,strlen(line));
。以任何您想要的方式解析它。 - Andrew Henle