gpt4 book ai didi

c - sprintf 原始字节到 C 中的字符串?

转载 作者:行者123 更新时间:2023-12-05 06:21:18 26 4
gpt4 key购买 nike

我正在使用 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 这样的格式说明符?

最佳答案

这是一个XY问题,你是在问如何使用sprintf()来解决你的问题,而不是简单地问如何解决你的问题。你的实际问题是如何让代码更“优雅”。

没有特别的理由在单个写入操作中发送数据 - 网络堆栈缓冲将确保数据有效地打包:

static const char header[] = "HTTP/1.1 200\r\n\r\n" ;
write( client, header, sizeof(header) - 1 ) ;
write( client, &x, sizeof(x) ) ;
write( client, &y, sizeof(y) ) ;

请注意,X 和 Y 将以本地机器字节顺序写入,这在接收方可能不正确。那么更一般地说:

static const char header[] = "HTTP/1.1 200\r\n\r\n" ;
write( client, header, sizeof(header) - 1 ) ;

uint32_t nl = htonl( x ) ;
write( client, &nl, sizeof(nl) ) ;

nl = htonl( y ) ;
write( client, &nl, sizeof(nl) ) ;

关于c - sprintf 原始字节到 C 中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59903259/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com