1

示例原始二进制图像文件:

ÿÃÿà^@^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 这样的二进制文件。

4

2 回答 2

3

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() 无论如何都不会工作,因为它假定以空字符结尾的字符串,它不会只附加一个字符。)

于 2013-09-18T11:07:06.990 回答
2

C 中的 string 是一个约定,它以零结尾。所以你需要的是一个固定/已知长度的二进制字符串。并且您需要使用 strlen 和 sprintf 以外的其他函数,这些函数会考虑长度。

于 2013-09-18T11:08:18.963 回答