2016-02-17 12 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

相关问题