【问题标题】:decoding data from old school measurement instrument从老式测量仪器解码数据
【发布时间】:2014-04-18 21:51:00
【问题描述】:

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

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

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
*/

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

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

【问题讨论】:

  • 听起来用文本编辑器打开文件无济于事……你最好使用十六进制编辑器。顺便说一句,@Wander Nauta 的答案对我来说很有意义,试着看看你能不能从中得到一些东西

标签: c decoding


【解决方案1】:

编码实际上非常聪明*:两个字母的每个组合(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 的位得到通道号。

这是一个如何解析单个测量值的示例,假设两个字节的输入在 ab 中:

  /* 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 之类的编码要简单得多,而且可能更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    相关资源
    最近更新 更多