如何正确打印无符号字符向量的一部分?

时间:2014-06-01 14:35:26

标签: c++ binaryfiles

typedef unsigned char BYTE;
std::vector<BYTE> bytes = readFile(path.c_str());

假设我想在向量中从位置30到34进行打印。

我试过这个:

unsigned char chars[4];
for (int i = 30; i < 34; i++)
{
    chars[i-30] = bytes[i];
}

std::cout << chars << std::endl;

我得到一个奇怪的符号,就是这样。 从30到34的字符向量包含\ x14,\ 0 \ 0 \ 0。 我尝试将chars转换为unsigned int和类似的东西。

2 个答案:

答案 0 :(得分:0)

如果你只是写std::cout << chars << std::endl,当然它会打印奇怪的东西,因为字符是一个指针。它会在其地址和以下位置打印该值,直到其到达的值为\0。在chars数组上循环以打印其内容,而不是尝试直接打印它。如果您希望输出格式正确,也可以转换为int:

for (int i = 0; i < 4; i++) {
    std::cout << static_cast<unsigned int>(chars[i]) << std::flush;
}

答案 1 :(得分:0)

您也可以使用它(是的,它会跳过'\0'):

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

typedef unsigned char BYTE;
struct printer{
    void operator()(BYTE c){
        if(c != 0){
            cout << c;
        }
    }
} printer;

int main() {

    vector<BYTE> v ={'a', '\0' ,'b', '\0', 'c', 'D'};
    BYTE a[6] = {'h', '\0', 'i', '\0', 'o', 'p'};
    for_each (v.begin(), v.end(), printer);
    cout<<endl <<"Now array" << endl;
    for_each (a, a + 6, printer);
    return 0;
}

On ideone以及......