我从股票 API 获得以下数据:
0, 0, 0, 1, 0, 4, 71, 79, 79, 71, 0, 0, 0, 0, 4, 68, 93, -17, -65, -67, 82, 68, 95, 5 , 31, >68, 93, 64, 0, 68, 93, -17, -65, -67, -17, -65, -67, 70, -17, -65, -67, 52, -17, -65, -67, >0, 0, 1, 63, -17, -65, -67, 99, 30, 0, 68, 92, -17, -65, -67, -17, -65, - 67, 68, 94, -17, >-65, -67, 0, 68, 91, 81, 72, 68, 94, -17, -65, -67, -17, -65, -67, 70, -17, -65, -67, -17, >-65, -67, 87, 0, 0, 1, 63, -17, -65, -67, -17, -65, -67, 122, 0 , 68, 93, -17, -65, -67, >-17, -65, -67, 68, 94, 74, -17, -65, -67, 68, 91, -17, -65, - 67, 0, 68, 91, -17, -65, -67, >70, 34, 107, 10, 0, 0, 1, 63, -17, -65, -67, -17, -65, - 67, -17, -65, -67, 0, 68, 95, 95, >92, 68, 95, -17, -65, -67, 61, 68, 93, -17, -65, -67, -17, -65, -67, 68, 94, -17, -65, >-67, 0, 70, 127, -17, -65, -67, 0, 0, 1, 63, -17, - 65, -67, -17, -65, -67
这是通过下面的代码成功读取的一段二进制文件,它返回数组 {error=0.0, symbol=GOOG, count=1, bars=4, length=4, bar=[]}:
0, 0, 0, 1, 0, 4, 71, 79, 79, 71, 0, 0, 0, 0, 4
从这一点开始,我一直在苦苦挣扎:
68, 93, -17, -65, -67, 82, 68, 95, 5, 31, >68, 93, 64, 0, 68, 93, -17, -65, -67, -17, -65 , >-67, 70, -17, -65, -67, 52, -17, -65, -67, >0, 0, 1, 63, -17, -65, -67, 99, 30, 0 , 68, 92, >-17, -65, -67, -17, -65, -67, 68, 94, -17, >-65, -67, 0, 68, 91, 81, 72, 68, 94, -17, -65, >-67, -17, -65, -67, 70, -17, -65, -67, -17, >-65, -67, 87, 0, 0, 1, 63, -17, -65, -67, >-17, -65, -67, 122, 0, 68, 93, -17, -65, -67, >-17, -65, -67, 68, 94, 74, -17, -65, -67, >68, 91, -17, -65, -67, 0, 68, 91, -17, -65, -67, >70, 34, 107, 10 , 0, 0, 1, 63, -17, -65, >-67, -17, -65, -67, -17, -65, -67, 0, 68, 95, 95, >92, 68, 95, -17, -65, -67, 61, 68, 93, >-17, -65, -67, -17, -65, -67, 68, 94, -17, -65, >-67, 0, 70, 127, -17, -65, -67, 0, 0, 1, >63, -17, -65, -67, -17, -65, -67
以上是四个“条”代码,包括收盘价、最高价、最低价、开盘价、成交量和时间图。所有这些都是 4 字节浮点数,除了 Volume 是一个长度为 8 的 Long。API 将长度描述为 8 位字节。
我在解析代码的第一位时没有问题(尽管它可能并不完美)。我遇到了其他问题。在 API 网站上,数据的结构如下:
字段类型 长度(8 位字节) 描述
Symbol Count Integer 4 正在为其返回数据的符号数。随后的部分重复了很多次
重复符号数据
Symbol Length Short 2 符号字段的长度
Symbol String 变量 返回历史数据的交易品种
错误代码字节 1 0=OK,1=ERROR
错误长度短 2 仅在错误代码=1 时返回。错误字符串的长度
错误文本字符串变量仅在错误代码=1 时返回。描述错误的字符串
Bar Count Integer 4 # 图表条数;仅当错误代码=0
重复价格数据
close Float 4 high Float 4 low Float 4 open Float 4 volume Float 4(以 100 为单位)时间戳 Long 8 时间,从 1970 年 1 月 1 日 UTC 00:00:00 开始以毫秒为单位
重复价格数据结束
终结符字节 2 0xFF、0XFF
重复符号数据结束 PriceHistory 响应采用二进制格式,由符号、图表数量表示
重复符号数据结束
我能够提取计数、长度、符号、错误代码和条数。但它正在解析我遇到问题的酒吧。我没有得到任何数据,而是像 D]�R9 这样的乱码。
如果你想看看我到目前为止有多糟糕,可以在这里找到代码:):http: //pastebin.com/5eq9XPjT
for (i=0;i<=dataArray.length;i++) {
if (i<=5) {
symbolDetails['count'] = Utilities.newBlob(dataArray[0] + dataArray[1] + dataArray[2] + dataArray[3]).getDataAsString(); //Symbol count
symbolDetails['length'] = Utilities.newBlob(dataArray[4] + dataArray[5]).getDataAsString(); // Length of record
i=5; // jump ahead
} else if (i>5 && i<6+Number(symbolDetails['length'])) {
for (j=0;j<Number(symbolDetails['length']);j++) {
symbolDetails['symbol'][j] = dataArray[i];
i++
}
i = 10;
Logger.log(symbolDetails['symbol']);
symbolDetails['symbol'] = Utilities.newBlob(symbolDetails['symbol']).getDataAsString();
// partTwo is the sequence of data after the symbol. As symbol can be of varying length, this will help us know where we are.
var partTwo = 5 + Number(symbolDetails['length']);
} else {
// Get Error Code
if (i == partTwo) {
symbolDetails['error'] = Utilities.newBlob(dataArray[i]).getDataAsString();
} else if (i>= Number(partTwo + 1) && i<=Number(partTwo+5)) {
// Get Bar Count
for (j=0;j<4;j++) {
symbolDetails['bars'] =+ dataArray[i];
i++;
}
symbolDetails['bars'] = Utilities.newBlob(symbolDetails['bars']).getDataAsString();
}
}
}
希望有人可以帮助解决这个问题。非常感谢。