目前我正在为原始数据(如 jpg 等)实施 Burrows-Wheeler 变换(和逆变换)。在对文本文件等普通数据进行测试时,不会出现问题。但是在读取 jpg 文件时,例如它会在字符 0x1a 又名替代字符处停止读取。我一直在互联网上搜索不采用操作系统相关代码但没有结果的解决方案......我想以二进制模式读取标准输入,但我猜这并不容易。有什么简单的方法可以解决这个问题吗?
代码:
buffer = (unsigned char*) calloc(block_size+1,sizeof(unsigned char));
length = fread((unsigned char*) buffer, 1, block_size, stdin);
if(length == 0){
// file is empty
}else{
b_length = length;
while(length == b_length){
buffer[block_size] = '\0';
encodeBlock(buffer,length);
length = fread((unsigned char*) buffer, 1, block_size, stdin);
}
if(length != 0){
buffer[length] = '\0';
encodeBlock(buffer,length);
}
}
free(buffer);
Run Code Online (Sandbox Code Playgroud)
正如您所注意到的,您正在stdin以 ASCII 模式读取,并且它正在击中 SUB 字符(替代,又名CTRL+ Z,又名 DOS End-of-File)。
setmode在 Windows 上,您必须将模式更改为二进制:
#if defined(WIN32)
#include <io.h>
#include <fcntl.h>
#endif /* defined(WIN32) */
/* ... */
#if defined(WIN32)
_setmode(_fileno(stdin), _O_BINARY);
#endif /* defined(WIN32) */
Run Code Online (Sandbox Code Playgroud)
在 Windows 以外的平台上,您不会在模式上遇到这种区别。