Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从'中提取值;二进制格式';文件并创建具有固定字段大小的文本文件_Javascript - Fatal编程技术网

Javascript 从'中提取值;二进制格式';文件并创建具有固定字段大小的文本文件

Javascript 从'中提取值;二进制格式';文件并创建具有固定字段大小的文本文件,javascript,Javascript,我曾使用JavaScript通过互联网获取数据(我正在与一家经纪公司的API函数进行交互),但与其他大多数API不同,此API以类似“二进制”的格式返回数据。以下是我得到的文件的布局: Field -------- Type ------------ Length(8 bit bytes) --------------- Description Symbol Count----Integer------------- 4-------------

我曾使用JavaScript通过互联网获取数据(我正在与一家经纪公司的API函数进行交互),但与其他大多数API不同,此API以类似“二进制”的格式返回数据。以下是我得到的文件的布局:

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不知道文件IO。这就是为什么我问它在哪里运行


编辑:

好吧,不知何故,您有一个类似浏览器的环境,其中运行着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);