1

下面的函数在被调用时只是为 html 提供服务,但是

void generateHTML (int socket) {
   char* message;

   // Sends HTTP response header

   message = "HTTP/1.0 200 OK\r\n"
                "Content-Type: text/html\r\n"
                "\r\n";
   printf ("about to send=> %s\n", message);
   write (socket, message, strlen (message));

   message = "<HTML><BODY><P>Hello World.</P></BODY></HTML>\n";
   printf ("about to send=> %s\n", message);
   write (socket, message, strlen (message));   
}

我在网络浏览器上的输出将是一条简单的 Hello World 消息。但是,我想更改它,以便它显示位图图像。让我们使用一个 1x1 的红色像素作为我们的 bmp。

到目前为止,我已通过以下方式修改了此功能:

void generateHTML (int socket) {
   char* message;

   // Sends HTTP response header

   message = "HTTP/1.0 200 OK\r\n"
                "Content-Type: image/bmp\r\n"
                "Content-Length: ???WTF???\r\n";
   printf ("about to send=> %s\n", message);
   write (socket, message, strlen (message));

   message = "BMF8\n";
   printf ("about to send=> %s\n", message);
   write (socket, message, strlen (message));   

   message = " "; //bmp file data goes here.
   printf ("about to send=> %s\n", message);
   write (socket, message, strlen (message));   
}

引用 Dan 的回答,十六进制的数据如下所示:

0000000: 424d 3a00 0000 0000 0000 3600 0000 2800  BM:.......6...(.
0000010: 0000 0100 0000 0100 0000 0100 1800 0000  ................
0000020: 0000 0400 0000 130b 0000 130b 0000 0000  ................
0000030: 0000 0000 0000 0000 0000                 ..........

但是,我根本无法将其放在引号内。我该怎么做?

4

3 回答 3

4

这是 1x1 黑色 Windows bmp 图像的 xxd 转储:

0000000: 424d 3a00 0000 0000 0000 3600 0000 2800  BM:.......6...(.
0000010: 0000 0100 0000 0100 0000 0100 1800 0000  ................
0000020: 0000 0400 0000 130b 0000 130b 0000 0000  ................
0000030: 0000 0000 0000 0000 0000                 ..........
于 2011-04-12T06:51:30.663 回答
0

扩展@Dan D. 所说的内容,您可以在 Linux(或者也可能是 Windows)机器上使用 ImageMagick 的“转换”命令将原始数据转换为图像。我用 .png 进行了测试,您必须自己在 Windows 上测试输出:

jcomeau@intrepid:~$ echo -en "\0000" | 转换 -size 1x1 -depth 8 gray:- /tmp/1black.bmp
jcomeau@intrepid:~$ xxd /tmp/1black.bmp
0000000: 424d 3a00 0000 0000 0000 3600 0000 2800 BM:.......6...(.
0000010: 0000 0100 0000 0100 0000 0100 1800 0000 ......
0000020: 0000 0400 0000 120b 0000 120b 0000 0000 ......
0000030: 0000 0000 0000 0000 0000 ......
于 2011-04-12T07:03:37.163 回答
0

要打印出来,您需要创建一个数组,例如 unsigned char bmp[] ={ 并在此处用上面的十六进制填充此部分。但是,因为它是十六进制的,所以您需要在每对数字的前面添加 0x。例如 0x42、0x4d 等。这可以只包含在 {} 括号中。例如 unsigned char bmp[] ={ 0x42, 0x4d, 0x.... } ,然后只需使用 write 函数通过套接字发送它。写(套接字,bmp,sizeof(bmp));

于 2013-04-28T11:37:15.177 回答