2016-02-17 9 views
0

У меня есть следующий фрагмент кода для преобразования из шестибитной ASCII в строку ASCII:BitSet <4> преобразуется в неправильное значение на Win7 Embedded

std::string SixBitToASCII(char *buffer) 
    { 
     std::stringstream ss; 
     std::stringstream out; 

     for (int index = 0; index < 16; index++) 
     { 
      std::bitset<4> bset(buffer[index]); 

      std::cout << buffer[index] << " - " << bset << std::endl; 

      ss << bset; 
     } 

     std::cout << ss.str() << std::endl; 

     for (int index = 0; index < 60; index += 6) 
     { 
      std::string s = ss.str().substr(index, index + 6); 
      std::bitset<6> bits; 
      std::istringstream is(s); 
      is >> bits; 

      int asciiCode = bits.to_ulong() + 32; 

      out << (char) asciiCode; 
     } 

     return out.str(); 
    } 

Это компилирует нормально. Я компилирую в VS2012 Win7 Professional 32bits.

Когда я запускаю его в встроенном Win7 I'm получает следующий результат:

8 - 1000 
f - 0110 <<< ??? PROBLEM HERE 
2 - 0010 
9 - 1001 
2 - 0010 
3 - 0011 
4 - 0100 
1 - 0001 
0 - 0000 
4 - 0100 
1 - 0001 
3 - 0011 

100001100010100100100011010000010000010000010011 

Что происходит, где, как цветовая проблема? Преобразование F в 0100 ??? Разве не должно быть 1111?

Конечно, окончательное преобразование неверно из-за этой ошибки, конвертирующей F. Я пробовал std::bitset<4> bset((unsigned char) buffer[index]) с такими же результатами.

Помогите оценить.

+0

Не используйте 'std :: endl', если вам не нужен дополнительный материал, который он делает. '' \ n'' заканчивает линию. –

+0

Не знаете, что вы подразумеваете под «Преобразование F в 0100»? Возможно, вы имели в виду "Converting f to 0110"? Что правильно для ASCII, как указывает Пит. Код ASCII для 'f' равен 01100110. Может быть, вы смешаетесь с шестнадцатеричной цифрой F. –

+0

Это поможет вашему вопросу, если вы показали, что было в «буфере», а также показали, что вы ожидали, и какую шестибитную кодировку вы использовали. Образцы в Википедии не содержат никаких строчных букв среди 64 символов. –

ответ

1

Чтобы лучше видеть, что происходит, изменить

std::cout << buffer[index] << " - " << bset << std::endl; 

в

std::cout << +buffer[index] << " - " << bset << std::endl; 

Это покажет вам числовое значение buffer[index] вместо любого характера, что числовое значение представляет. Я не говорю теперь о том, что означает «Sixbit ASCII», но с прямым ASCII результат, который вы видите, - именно то, что я ожидаю: код ASCII для буквы f равен 0x66, поэтому низкие 4 бита, 0110. Вам нужно преобразовать эти коды символов в цифры. Опять же для ASCII (и для всех стандартных кодов символов) значения в диапазоне '0' до '9' могут быть преобразованы путем вычитания '0'; значения в диапазоне от 'a' до 'f' и 'A' до 'F' потребуют более сложного поиска.

+0

[link] https://en.wikipedia.org/wiki/Six-bit_character_code для SixBit. Символы имеют шестнадцатеричные значения 1 байт. BTW: Что делает '+' do .. Теперь я вижу все десятичные значения (в этом случае 102 для f) ... humm. Мне нужно преобразовать текстовое шестнадцатеричное значение в числовое шестнадцатеричное значение ... – Mendes

+0

@Mendes - эта статья в Википедии содержит список вариантов. Независимо от того, что этот вставщик потока показывает значение символа, которое представляет каждая запись; чтобы выяснить, что происходит, вы должны посмотреть на числовое значение. –

+0

Пит, который мне помог. Мне нужен ASCII Literal для целочисленного конвертера ... Проблема для новой темы ... Спасибо. – Mendes