2016-02-17 14 views
0

我有下面這段代碼從摩斯電ASCII轉換爲ASCII字符串:位集合<4>轉換爲錯誤值Win7上的嵌入式

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專業32位。

當我運行在嵌入式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 

這是怎麼回事其中maked是一個問題?轉換F0100 ???不應該是1111

課程的最後轉換是錯誤的,由於這個錯誤convering F。我試過std::bitset<4> bset((unsigned char) buffer[index]),結果相同。

幫助讚賞。

+0

除非你需要額外的東西,否則不要使用'std :: endl'。 ''\ n''結束一行。 –

+0

不確定您的意思是「將F轉換爲0100」?你的意思是「將f轉換爲0110」?正如Pete指出的那樣,這對ASCII是正確的。 'f'的ASCII碼是01100110。也許你正在混合十六進制數字F. –

+0

如果你顯示了「緩衝區」中的內容並顯示了你的預期和你正在使用的六位編碼,這將有助於你的問題。維基百科上的樣本不包括64個字符中的任何小寫字母。 –

回答

1

更好地看到發生了什麼事情,改變

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

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

會告訴你的buffer[index]的數值,而不是任何字符數值表示。我現在不會說「Sixbit ASCII」是指什麼,但是對於直接的ASCII,你看到的結果正是我所期望的:字母f的ASCII碼是0x66,所以低4位的確是, 0110.您需要將這些字符代碼轉換爲數字。再次對於ASCII(以及對於所有標準字符代碼),範圍'0''9'中的值可以通過減去'0'來轉換;通過'f''A'通過'F'值的範圍在'a'將需要更復雜的查找。

+0

[link] https://en.wikipedia.org/wiki/Six-bit_character_code for SixBit。這些字符是1個字節的十六進制值。順便說一下:'+'做了什麼..現在我看到所有的十進制值(在這個例子中爲102)...... humm。我需要將文本十六進制值轉換爲數字十六進制值... – Mendes

+0

@Mendes - 維基百科文章列出了一堆變體。無論如何,該流插入器顯示每個條目表示的字符值;要弄清楚發生了什麼,你必須看看數字值。 –

+0

皮特,那幫了我。我需要一個ASCII Literal到整數轉換器...發佈一個新的主題......謝謝。 – Mendes

相關問題