Javascript 从'中提取值;二进制格式';文件并创建具有固定字段大小的文本文件
我曾使用JavaScript通过互联网获取数据(我正在与一家经纪公司的API函数进行交互),但与其他大多数API不同,此API以类似“二进制”的格式返回数据。以下是我得到的文件的布局:Javascript 从'中提取值;二进制格式';文件并创建具有固定字段大小的文本文件,javascript,Javascript,我曾使用JavaScript通过互联网获取数据(我正在与一家经纪公司的API函数进行交互),但与其他大多数API不同,此API以类似“二进制”的格式返回数据。以下是我得到的文件的布局: Field -------- Type ------------ Length(8 bit bytes) --------------- Description Symbol Count----Integer------------- 4-------------
Field -------- Type ------------ Length(8 bit bytes) --------------- Description
Symbol Count----Integer------------- 4--------------------------- Number of symbols for which data is being returned. The subsequent sections are repeated this many times
REPEATING SYMBOL DATA
Symbol Length Short 2 Length of the Symbol field
Symbol String Variable The symbol for which the historical data is returned
Error Code Byte 1 0=OK, 1=ERROR
Error Length Short 2 Only returned if Error Code=1. Length of the Error string
Error Text String Variable Only returned if Error Code=1. The string describing the error
Bar Count Integer 4 # of chart bars; only if error code=0
REPEATING PRICE DATA
close Float 4
high Float 4
Low Float 4
open Float 4
volume Float 4 in 100's
timestamp Long 8 time in milliseconds from 00:00:00 UTC on January 1, 1970
END OF REPEATING PRICE DATA
Terminator Bytes 2 0xFF, 0XFF
END OF REPEATING SYMBOL DATA
如您所见,此文件是不同类型字段的混合。我的要求是将此文件从原来的方式转换为固定字段文本文件(或CSV文件)。我对JavaScript不是很在行,但我知道的足够多了。我的主要语言是Unisys的MAPPER(它实际上被称为“业务信息服务器”)。目前我得到的所有HTTP响应都是文本文件,但这是一个“二进制”文件,MAPPER无法处理它,因为它是一种基于文本的语言(4GL)。我花了好几天的时间试图找到一段我可以使用的JavaScript代码,但都没有用。我认为对于一个懂JavaScript的人来说,这真的很简单 我是UNISYS的程序员。在2200大型机上使用FORTRAN 77 25年。幸运的是,我很少和MAPPER有任何关系 我很想帮忙,但你提供的信息不够
- 这个JavaScript代码在哪里运行?在浏览器中,或者它是用于访问MAPPER的任何对象的扩展李>
- 你在使用某种终端模拟器吗?附庸
- 您的数据是真的到达一个文件中,还是在内存中?你是如何接收它的,你是如何传递内容的
- 在JavaScript中进行处理是否至关重要?如果数据以文件形式存在,并且输出也应该是文件,那么有几十种语言可以缩短任务的执行时间
编辑: 好吧,不知何故,您有一个类似浏览器的环境,其中运行着JavaScript 首先,从响应中获取二进制数据的问题。这里有一些帮助: 这是Mozilla文档,在“接收二进制数据”下,但我希望有足够的重叠,使其有用:
function load_binary_resource(url) {
var req = new XMLHttpRequest();
req.open('GET', url, false);
//XHR binary charset opt by Marcus Granado 2006 [http://mgran.blogspot.com]
req.overrideMimeType('text/plain; charset=x-user-defined');
req.send(null);
if (req.status != 200) return '';
return req.responseText;
}
通过上面的操作,您可以稍微调整一下连接,以获得二进制数据
该函数的调用方式如下:
var filestream = load_binary_resource(url);
var abyte = filestream.charCodeAt(x) & 0xff;
…如果我理解正确,您的responseText
是一个JavaScript字符串(与往常一样),但由于篡改和二进制内容,它不包含可打印的文本,而是二进制数据。嘿,只要你不去解释它,它只是一系列字节,就像任何旧文本一样
第二行允许您从字符串中的任何位置提取单个字节。该字节将是一个介于0和255之间的值;或者如果你运气不好,在-128和127之间。不确定JavaScript如何处理有符号字节
这看起来好像对你没什么好处。让我们看看如何获取数据:
您的数据以一个名为symbolength
的short
开始。我猜short
是2个字节,我猜charCodeAt()
的偏移量从0开始。因此,您需要前两个字节,或者字节0和1。我不确定您的数据是以高位还是低位输入,但您应该能够从这两者中重建short
var symbolLength = fileStream.charCodeAt(0) + 256 * fileStream.charCodeAt(1);
或
换句话说,使用乘法将字节重新组合成整数
整数大概是4个字节,因此您将乘以256的4次幂:16777216、65536、256和1,或者按该顺序,或者相反
当然,字符串数据正是如此,一旦考虑到前面字段占用的字节数,就应该能够使用子字符串运算符从响应字符串中挖掘出来
现在来看看讨厌的部分--float
s的转换。这些数字的内部结构由定义float
可能对应于binary32
和double
(如果有)对应于binary64
。我链接的Wikipedia文章中的链接很好地解释了这些格式,如果您感到绝望,您可以编写自己的转换例程,但如果您愿意,我会为其寻找现成的编码。你肯定不是第一个将一小部分字节转换成浮点数的人。也许您可以找到一些可以手动转换的C或Java代码,或者您甚至可以找到一个已经用JavaScript编写的例程
最后,一旦您有了转换您提到的所有数据类型的方法,您所需要做的就是将数据格式化为您希望在MAPPER中看到的任何格式。循环遍历结构,增加偏移量的指针。。。对你来说可能没什么新鲜事
诚然,我在这里做了很多猜测和手工操作。这可能是一个解决方案的开始,但您可能需要做一些实验,并提出一些详细的问题。不要提及UNISYS,将你的问题表述为你想在IE中这样做:)
作为第一步,我会尝试将传入的二进制字符串(按字节,最好是十六进制)转储到某个介质中,在该介质中,您可以读取该字符串,并将看到的字节与输入数据中预期的字节进行比较。您的规范没有意义。你也许可以做一些疯狂的字符串解析,但这不是小事。我处理的是同一家经纪公司的同一个API。这个问题对于这群人来说可能有点离题,所以请给我发邮件给pwilson dot net的p1。我们可以私下讨论。更清楚地说:pwilson dot netStefan的p1,谢谢你的评论-我刚刚发现使用C或C+显然没有我想象的那么简单。嗨,Carl,很抱歉你从来没有这样的乐趣。MAPPER是一种伟大的商业编程语言。这个
var symbolLength = 256 * fileStream.charCodeAt(0) + fileStream.charCodeAt(1);