如何在char中保存二进制null

时间:2013-09-18 11:03:56

标签: c binary

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

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

2 个答案:

答案 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)

C中的

字符串是一种约定,它是零终止的。所以你需要的是一个固定/已知长度的二进制字符串。并且您需要使用除strlen和sprintf之外的其他函数,这需要考虑长度。