示例原始二进制图像文件:
ÿÃÿà ^@^PJFIF^@^A^A^@^@^A^@^A^@^@ÿÃ^@<84>^@
注意:
^@ = null
结果二进制图像文件:
ÿÃÿà ^PJFIF^A^A^A^AÿÃ<84>
^ @ missing
示例代码:
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值吗?我已经尝试过上面的代码,但二进制null消失了。如何在char中保存二进制null?还是有其他类型的数据来保存它? 我想用udp socket发送像jpg这样的二进制文件。
答案 0 :(得分:3)
printf()系列函数和strcat()假设null char表示“字符串结束”。你拥有的不是一个以null结尾的字符串。所以不要使用任何printf()函数或strcat()。使用memcpy()等内容复制数据,并指定要复制的数据的确切长度。如果你需要逐字节复制,那么只需进行直接赋值并保留两个索引,一个给出输出缓冲区的当前尾部,另一个给出输入缓冲区的头部。
您的代码虽然令人困惑,但您不希望这样做。下面是一些示例代码,它们尝试实现您的原始intent,但不假设null-chars正在终止数据序列:
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()无论如何都不会起作用,因为它假定以空字符结尾的字符串,它不会只附加一个字符。)
答案 1 :(得分:2)
字符串是一种约定,它是零终止的。所以你需要的是一个固定/已知长度的二进制字符串。并且您需要使用除strlen和sprintf之外的其他函数,这需要考虑长度。