c - 如何在char中保存二进制null

标签 c binary

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

ÿÃÿà^@^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/

相关文章:

c - 读取文件时 _IO_ getc 出现段错误

c - 递归删除目录

sscanf可以用来匹配通配符吗?

python - 如何在没有音频库的情况下编辑原始 PCM 音频数据?

binary - 如何使用 float 执行舍入到偶数

python - 如何在 python 中使用二进制搜索算法(不实现任何函数)搜索数字

c - 数组是常量数据类型吗

java - 在java中写单个字符的奇怪行为

java - Java读写二进制文件(看到一半文件损坏)

c - write() 还是 printf() 更好?