使用fstream class
读取时如何存储数据?一个例子将澄清我的问题:
char * memBlock = NULL;
fileSize = file.tellg();
memBlock = **new** char[fileSize];
file.seekg(0, ios::beg);
file.read(memBlock, fileSize);
file.close();
if(memBlock)
return memBlock;
上下文是我正在读取以十六进制记录的原始图像,以便
在内存中读取文件时,memblock array
中的值是以ff和00存储还是由ASCII或其他东西自动转换为1和0?
答案 0 :(得分:0)
当数据存储为十六进制时
00FF00FF
并且您使用file.read
阅读,如您的代码所示,
然后它被存储为,这意味着
memcmp(memblock, "00FF00FF", 8) == 0
将评估为真。
修改强>
您必须自己进行转换。一种方法是
int ConvertToColor(const char *colorBuffer, size_t size)
{
int color = -1;
if(size >= 2)
{
char colorCode[3] = { colorBuffer[0], colorBuffer[1], 0 };
long longColor = strtol(colorCode, NULL, 16);
if(longColor != LONG_MAX && longColor != LONG_MIN)
color = (int)longColor;
}
return color;
}
std::vector<int> ConvertToColors(const char *memBlock, size_t size)
{
std::vector<int> colors;
for(size_t i = 0; i < size; i += 2)
{
int color = ConvertToColor(memBlock + i, size - i);
if(color < 0)
throw std::exception("Unable to convert color.");
colors.push_back(color ? 1 : 0);
}
return colors;
}
答案 1 :(得分:0)
要读取原始数据文件,首先必须以二进制模式打开文件,这不是fstream
的默认模式。使用file.open(filename, std::ios::binary|std::ios::in)
。
这样,读入内存缓冲区的内容将与文件内容完全相同。
因此,如果文件中包含00ff00ff
,您的内存中将有00ff00ff
。没有转换。
如果您要将其转换为0
和1
,假设00ff00ff
,则表示每个字节为0x00, 0xff, 0x00, 0xff
,您可以执行以下操作转换:(如果00ff00ff
实际上是8个ASCII字符,请参阅esskar的回答)
for (size_t i=0; i<fileSize; i++)
{
if (memBlock[i]!=0) memBlock[i]=1;
// or
// memBlock[i] &= 1;
}
这会将缓冲区转换为二进制0
和1
字节的序列。