【发布时间】:2009-04-20 13:12:48
【问题描述】:
我有一组 6 位代表 7 位 ASCII 字符。如何从我拥有的 6 位中获得正确的 7 位 ASCII 码?只需附加一个零并按位或吗?
感谢您的帮助。
伦纳特
【问题讨论】:
-
您需要提供更多信息。您的 6 位数据来自哪里? (也许是 LabView?)
我有一组 6 位代表 7 位 ASCII 字符。如何从我拥有的 6 位中获得正确的 7 位 ASCII 码?只需附加一个零并按位或吗?
感谢您的帮助。
伦纳特
【问题讨论】:
ASCII 本质上是一个 7 位字符集,所以你所拥有的不是“6 位 ASCII”。哪些角色构成了您的角色集?最简单的解码方法大概是这样的:
char From6Bit( char c6 ) {
// array of all 64 characters that appear in your 6-bit set
static SixBitSet[] = { 'A', 'B', ... };
return SixBitSet[ c6 ];
}
脚注:6 位字符集在旧的 DEC 硬件上非常流行,其中一些(如 DEC-10)具有 36 位架构,其中 6 位字符有意义。
【讨论】:
您必须告诉我们您的 6 位字符集的外观,我认为没有标准。
进行反向映射的最简单方法可能是只使用查找表,如下所示:
static const char sixToSeven[] = { ' ', 'A', 'B', ... };
这假设空间编码为(二进制)000000,大写 A 编码为 000001,依此类推。
你用你的一个六位字符索引到sixToSeven,然后取回本地的七位字符。
【讨论】:
我无法想象您为什么会变旧 DEC-10/20 SIXBIT,但如果是这样,那么只需添加 32(十进制)。 SIXBIT 取的是以空格(32)开头的 ASCII 字符,所以只需在 SIXBIT 字符上加 32 即可得到 ASCII 字符。
【讨论】:
我知道的唯一最近的 6 位代码是 base64。这使用四个 6 位可打印字符来存储三个 8 位值(6x4 = 8x3 = 24 位)。
6 位值取自字符:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
它们是 0 到 63 的值。其中四个(比如UGF4)用于表示三个 8 位值。
UGF4 = 010100 000110 000101 111000
= 01010000 01100001 01111000
= Pax
如果您的数据是这样编码的,那么周围有很多 sn-ps 会告诉您如何对其进行解码(并且许多语言都内置了编码器和解码器,或者在包含的库中)。维基百科有一篇很好的文章here。
如果它不是 base64,那么你需要找出编码方案。一些较旧的方案使用移入/移出(SI / SO)代码的其他查找方法来选择字符集中的页面,但我认为这更多是用于选择扩展(例如,日语DBCS)字符而不是普通的ACSII字符.
【讨论】:
如果我给你一个比特的值,并且我声称它是从 Windows XP 中获取的,你能重建整个操作系统吗?
你不能。你丢失了信息。除非您对丢失的什么有所了解,否则无法重建它。如果您知道,例如,最重要的位被切掉了,那么您可以将其设置为零,并且您已经正确地重构了至少一半的字符。
如果您知道“a”和“z”在 6 位编码中是如何表示的,则可以通过将它们与 7 位表示进行比较来猜测删除的内容。
【讨论】: