示例原始二进制图像文件:
ÿÃÿà ^@^PJFIF^@^A^A^@^@^A^@^A^@^@ÿÃ^@<84>^@
注意:
^@ = null
结果二进制图像文件:
ÿÃÿà ^PJFIF^A^A^A^AÿÃ<84>
^@失踪
示例代码:
char sendBuffer[17500];
char buffer[16000];
char sendBuffer2[17500];
char temp[10];
inputFile = fopen("image.jpg", "rb");
fseek(inputFile , 0, SEEK_SET);
fread(buffer, fileSize, 1, inputFile );
for (j = 0; j < fileSize; ++j)
{
sprintf(sendBuffer, "%c", ((char *)buffer)[j]);
if (((char *)buffer)[j] == '\x00')
{
sprintf(temp, "%c", buffer[j]);
strcat(sendBuffer2, temp);
}
else
{
strcat(sendBuffer2, sendBuffer);
}
二进制空值可以存储在 char 中吗?
我已经尝试过上面的代码,但是二进制 null 不见了。如何在 char 中保存二进制 null?或者是否有其他类型的数据来保存它?
我想用 udp 套接字发送像 jpg 这样的二进制文件。
最佳答案
printf() 函数系列以及 strcat() 假定空字符表示“字符串结束”。但是,您拥有的不是以空字符结尾的字符串。所以不要使用任何 printf() 函数或 strcat()。使用类似 memcpy() 的方法复制数据,并指定要复制的数据的确切长度。如果您需要逐字节复制,则只需进行直接赋值并保留两个索引,一个给出输出缓冲区的当前尾部,一个给出输入缓冲区的头部。
虽然您的代码令人困惑,但不清楚您希望它做什么。下面是一些示例代码,它试图实现您的初衷,但不假设空字符正在终止数据序列:
char sendBuffer[17500];
char buffer[16000];
char sendBuffer2[17500];
size_t sendbuf2_len = 0;
char temp[10];
inputFile = fopen("image.jpg", "rb");
fseek(inputFile , 0, SEEK_SET);
fread(buffer, fileSize, 1, inputFile );
for (j = 0; j < fileSize; ++j) {
sendBuffer[0] = buffer[j];
if (buffer[j] == '\x00') {
temp[0] = buffer[j];
// Append.
sendBuffer2[sendbuf2_len++] = temp[0];
} else {
// Append.
sendBuffer2[sendbuf2_len++] = sendBuffer[0];
}
但是没有意义。无论如何,您的 if 分支只是复制相同的数据,因为 temp[0] 和 sendBuffer[0] 将包含相同的字节。
在您的原始代码中,您有:
sprintf(sendBuffer, "%c", ((char *)buffer)[j]);
然后在第一个 if
分支中你有:
sprintf(temp, "%c", buffer[j]);
strcat(sendBuffer2, temp);
在这两种情况下,您的字节都是 buffer[j]
。所以你的 if
语句并没有真正做任何有用的事情。在这两种情况下,相同的字节附加到 sendBuffer2
。 (当然要注意 strcat() 无论如何都不会工作,因为它假定以 null 结尾的字符串,它不会只附加一个字符。)
关于c - 如何在char中保存二进制null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18870527/