繁体   English   中英

将int的二进制文件读取为字符串C ++

[英]Reading binary file of int to string c++

我在读取二进制文件时遇到问题。 当我读取包含字符串的二进制文件时,它读起来很完美。 但是当我尝试读取看起来像这样的文件时:

1830 3030 3030 3131 3031 3130 3000 0000
0000 0000 0000 0000 1830 3030 3030 3131
3030 3030 3100 0000 0000 0000 0000 0000
1830 3030 3030 3131 3030 3131 3000 0000
0000 0000 0000 0000 1830 3030 3030 3131
3031 3030 3000 0000 0000 0000 0000 0000
1830 3030 3030 3131 3031 3131 3100 0000
0000 0000 0000 0000 1830 3030 3030 3131
3130 3130 3100 0000 0000 0000 0000 0000 ... and so on 

它只读取其中的一部分。 这是我用于读取二进制文件并将其转换为字符串的代码。

string toString (const char *c, int size);

int main(int argc, char* argv[]) 
{
    streampos size;
    char * memblock;

    ifstream file (argv[1], ios::in|ios::binary|ios::ate);
    size = file.tellg();
    memblock = new char[size];
    file.seekg (0, ios::beg);
    file.read (memblock, size);
    file.close();

    string input = toString(memblock,size);
    cout << input << endl; //this prints just portion of it 000001101100
    return 0;
}

string toString (const char *c, int size)
{
    string s;
    if (c[size-1] == '\0')
    {
        s.append(c);
    }
    else 
    {
        for(int i = 0; i < size; i++)
        {
            s.append(1,c[i]);
        }

    }

    return s;
}

但是,当我尝试读取0和1的txt文件时,它的读取效果很好。 我对C ++很陌生,但我不确定为什么会这样。

您的问题是您正在使用cout 这旨在打印人类可读的字符串,而不是二进制字符串。 因此,您标记的行:

cout << input << endl; //this prints just portion of it 000001101100

只打印它的一部分。

您提供的二进制数据是:

1830 3030 3030 3131 3031 3130 3000 0000

这是数据第一行的ASCII:

<CAN> "000001101100" <NUL> <NUL> <NUL>

第一个<CAN>0x18 <NUL>的值为0这就是cout停止的地方:它将打印人类可读的ASCII值,直到遇到0您的数据已满。

您需要打印字符的十六进制值-这是一个涉及更多的过程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM