从旧学校测量仪器解码数据

时间:2014-03-13 21:03:32

标签: c decoding

我正在尝试从旧的测量仪器恢复原始数据,这是通过打印机端口连接的。

例如,仪器软件将生成如下文本输出文件:

S 11/08/08 22:27:58 100 2 U 061 
D ___^PR_^_^_]PP_]_^_]_^_____^_^_____^_[_\_\_[_Z_Z_X 
D _W_U_T_Q^]^]^Z^V^S^T^S]]]Y]U]R]T]Q]V]Z]\]]^R^]_ZPX
D QSQYQ^RSRYSQSWS\S]SZSWSSSPR\RZRXRTQ^QWQPP[PUPRPQ_^
D _\_]_^_____\_\_Z_X_W_Y_X_X_Z_W_U_V_W_X_[_X_W_W_W
F 2 
S 11/08/08 22:35:03 100 2 E 049 
D QSQQP_P^QPQPQRQUQUQUQVQZQ[Q\Q]RSR\STSXSWSQR_SQSRR[
D RTQ_QWQUQWQUQZRSSQR]RTRSRQQZQRPZPVPTPTPSPWPTPQPQ_^
D _^_^__PPPPPP__PP__PR__PPPQ_____^_]_]PP_^_]_]_]_Y_^
D ___^_^_\_______^PP__PRPQPPPRPP__PPPP___]_^_^__PP
F 2

“S”线都很好 - 提供适当的测量时间 与其他一些价值观一起被带走了。

我有兴趣恢复隐藏的内容 “D”行。该软件使用此数据生成绘图,但是 不提供原始数据。

我详细说明数据编码的唯一代码包含注释:

/* Packs the 8-bit data into two 7-bit ASCII chars, encoding the channel
* number into it as well, in the format:
*
* 1CCMMMM and 1CCLLLL, where CC = chn, MMMM/LLLL = Most/Least sig nibble
*/

如果它有帮助,我也可以发送实际的包装代码 - 只是试图保持 问题尽可能小。

任何帮助 - 即使是正确方向的一点也不胜感激......

1 个答案:

答案 0 :(得分:5)

编码实际上非常巧妙*:两个字母的每个组合(2 * 8位或2 * 7位,具体取决于您的看法)是单次测量。评论告诉我们编码是如何工作的。例如,如果我们以“QS”为例:

Pattern: 01CCMMMM 01CCLLLL
Example: 01010001 01010011 = Q S

Channel: ..CC.... ..CC....
         ..01.... ..01.... = Channel 1

Data:    ....0001 ....0011 = 10011 = 19

你只需要取标记为M的位和标记为L的位,将它们放在一起,将整个数据视为单字节数,然后就可以得到原始数据了。相反,提取标记为C的位以获取通道编号。

以下是一个如何解析单个测量的示例,假设输入的两个字节位于 a b 中:

  /* To get the channel, mask with 00110000 = 0x30 then shift */
  char channel = (a & 0x30) >> 4;

  /* To get data, mask both with 00001111 = 0xF then combine */
  char orgdata = ((a & 0xF) << 4) | (b & 0xF);

将所有内容放在一起here为您的示例中的第一个“框架”提供以下数据,所有这些数据都在通道1上:

我希望这与你在剧情中看到的相符:)

*:我也不是讽刺 - 这个编码将10位有用数据打包到14位可用空间中,同时比base64更简单,可能更快。