2016-07-12 2 views
0

아래의 함수를 사용하여 일련의 바이트를 인쇄하려고합니다. 예를 들어 문자 0xED가 예를 들어 이상하게 보입니다. (내부에 물음표가있는 이상한 문자, 마치 인쇄 할 수없는 것처럼). 그것은 내 코드 또는 내가 인쇄 한 콘솔 때문입니까?바이트의 인쇄 순서

또한 올바른 코드입니까? 개선을 위해 다르게 수행 한 것이 있습니까?

편집 : 출력 예를

1F 8B 08 00 00 00 00 00 97 86 22 0D 89 72 EC 04 ........ .."..r�. 

감사

특정 옥텟 (바이트)이 시스템 환경의 로케일에 전적으로 의존하는 특정 문자를 표시 여부
void printBytes(std::string string) { 
    QDebug qD = qDebug().nospace(); 
    qD << "Printing string of size " << string.size() << "\n"; 
    char buffer [3]; 
    int j = 0; 
    std::string printable = ""; 
    for (uint32_t i = 0; i != string.size(); ++i) { 
     snprintf(buffer, sizeof(buffer), "%02X", (unsigned char) string.at(i)); 
     qD << buffer; 
     printable += QChar(string.at(i)).isPrint() ? string.at(i) : '.'; 
     printable += j == 7 ? " " : ""; 
     if (j == 15) { 
      qD << "\t" << printable.c_str() << "\n"; 
      printable = ""; 
      j = 0; 
     } else { 
      qD << (j == 7 ? " " : " "); 
      j++; 
     } 
    } 
    if (j != 0) { 
     qD << std::string((16-j) * 3, ' ').c_str() << "\t" << printable.c_str(); 
    } 
} 
+2

문자 집합이 맞지 않습니다. charset Y를 사용하는 디스플레이 환경에서 charset X의 문자를 인쇄하려하고 "y"charset에 해당 문자 글리프가 없거나 해당 문자 세트에 대해 잘못된 문자가있는 것입니다. –

+0

문자 대신 숫자 값을 인쇄하는 것이 좋습니다. – nosbor

+0

관련 : http://stackoverflow.com/a/217269/12711 –

답변

2

.

옥텟 0xED은 실제로 ISO-8859-1 (또는 ISO-8859-15, 아마도) 로캘의 문자입니다. 그러나 예를 들어 시스템 환경의 로켈이 UTF-8 인 경우 (현대의 모든 운영 체제에서 일반적으로 그렇듯이) 문자 í는 멀티 바이트 시퀀스 0xC3 0xAD으로 표시됩니다.

가장 확실한 대답은 사용자가 지정하지 않은 운영 체제가 ISO-8859-n 로켈을 사용하지 않지만 아마도 UTF-8 (또는 다른 인코딩) 일 것입니다. 시스템 환경을 다시 구성하거나 프로그램 출력에 UTF-8 (또는 올바른 인코딩)을 사용하십시오.

+0

예 내 콘솔은 UTF8을 사용하고 있습니다. 내 코드가 UTF8로 문자를 표시한다는 것이 더 합리적이라고 생각합니다. 내가 어떻게 그럴 수 있니? – jido51

+0

글쎄, 보여줄 문자에 해당하는'UTF-8' 옥텟 시퀀스를'std :: cout'에 쓰면됩니다. ISO-8859-1로 인코딩 된 문자를 표시하는 것과 똑같은 프로세스. –

+0

죄송합니다. 따라 가지 않습니다. 난 그냥 wireshark 예를 들어, 라인의 오른쪽 부분에 인쇄 가능한 문자를 인쇄하고 싶지만, isPrint() 사실을 반환하더라도, 그것은 인쇄 할 수 없습니다. 그렇다면 인쇄 할 수있게하려면 어떻게해야합니까? 아니면 내가 뭘 잘못하고 있습니까? – jido51