这将是一个很长的问题,但是请允许我,我将尽力解释。
为了进行简单的统计,我尝试读取某个数据集,但是数据的格式很奇怪。让我们从一个示例数据数组开始。数据在内部按8块编号组织。

[101, 103, 253, 253, 253, 102, 104, 254, 73, 32, 100, 111, 110, 39, 116, 32, 107, 110, 111, 119, 32, 119, 104, 97, 116, 32, 105, 115, 32, 32, 32, 32, 254, 254, 101, 102, 254, 254, 254, 0]


在数据文件中,有几个案例和几个变量(在这种情况下为3个变量和3个案例。一个案例可以看作是问卷的“答复者”)。

变量看起来像这样(仅某些值相关)

Variable A: Length 8 (regular number)
Variable B: Length 8 (regular number)
Variable C: Length 20 (string)


这意味着变量A将占用一个字节,变量B也将占用,变量C将占用3个字节(ceil(20/8))。

如果值在1到251之间,则需要使用'value-一定的偏差。在这种情况下100'

至此,数据将如下所示:

Case 1 Variable A: 1
Case 1 Variable B: 3


但是,并非每个单个值都适合“一个字节”。例如,变量C是一个String变量,可能会有多个字节。这就是253值的来源。

253表示:“下一个8个字节的块将是此变量的值”。 253的多个值将意味着该值将有多个块。在这种情况下,我们知道变量C需要3个字节。所有这3个字节都是值253,因此我们知道我们需要在该块之后读取8个字节的3个块。

从数组的第8个元素开始,将是:

[73, 32, 100, 111, 110, 39, 116, 32, 107, 110, 111, 119, 32, 119, 104, 97, 116, 32, 105, 115, 32, 32, 32, 32]


将其转换为字符串可以使我们:

我不知道是什么

因此,此时数据将是这样的:

Case 1 Variable A: 1
Case 1 Variable B: 3
Case 1 Variable C: 'I don't know what is'


之后,我们继续处理数据。我们在最后一个253处停止,因此现在还有两个数字(102和104,分别是2和4)。

此时数据将是这样的:

Case 1 Variable A: 1
Case 1 Variable B: 3
Case 1 Variable C: 'I don't know what is'
Case 2 Variable A: 2
Case 2 Variable B: 4


现在我们看到的值为254。这意味着一个“空字符串”。请注意,变量C(当前变量)的长度为3个字节。我们在这个块中只剩下1个字节。因此,我们需要跳过已经读取的块,然后再读取两个字节。下一个块是:

[254, 254, 101, 102, 254, 254, 254, 0]


这将使案例2变量C 254、254、254的值产生以下数据集:

Case 1 Variable A: 1
Case 1 Variable B: 3
Case 1 Variable C: 'I don't know what is'
Case 2 Variable A: 2
Case 2 Variable B: 4
Case 2 Variable C: ''


之后,我们还有更多要解释的值,从而构成了结束数据集:

Case 1 Variable A: 1 - (101)
Case 1 Variable B: 3 - (103)
Case 1 Variable C: 'I don't know what is' (253, 253, 253 = read 3 blocks: [73, 32, 100, 111, 110, 39, 116, 32, 107, 110, 111, 119, 32, 119, 104, 97, 116, 32, 105, 115, 32, 32, 32, 32]
Case 2 Variable A: 2 - (102)
Case 2 Variable B: 4 - (104)
Case 2 Variable C: '' - (254, 254, 254)
Case 3 Variable A: 1 - (101)
Case 3 Variable B: 2 - (102)
Case 3 Variable C: '' - (254, 254, 254)


头脑清晰地做到这一点似乎很容易。我无法以编程方式执行此操作。有人有什么想法吗?

最佳答案

我认为您至少应该有3个指针:

curblock = 0; // current 8 byte block
ptr = 0; // byte in current 8 byte block
nextblock = 8; // next 8 byte block


还有两个函数readNumber()和readString()根据这些指针从数组中读取,并且当然会更新这些指针。提示:

...
if(ch == 253) {
    // my_tostring() must be implemented
    str += my_tostring(data.slice(nextblock, nextblock+8));
    nextblock += 8;
}

...
ptr++;
if(ptr == 8) { ptr=0; curblock=nextblock; nextblock+=8; }

10-06 13:59