- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 Mozilla 的附加 SDK 从文件中读取和写入原始数据。目前我正在读取类似的数据:
function readnsIFile(fileName, callback){
var nsiFile = new FileUtils.File(fileName);
NetUtil.asyncFetch(nsiFile, function (inputStream, status) {
var data = NetUtil.readInputStreamToString(inputStream, inputStream.available(),{charset:"UTF-8"});
callback(data, status, nsiFile);
});
}
这适用于文本文件,但当我开始处理超出 Unicode 正常范围的原始字节时,它就不起作用了。例如,如果文件包含字节 0xff,则根本不会读取该字节和该字节之后的任何内容。有什么方法可以使用 SDK 读取(和写入)原始数据吗?
最佳答案
您已在 NetUtil.readInputStream
的选项中指定了显式 charset
。
当您省略 charset
选项时,数据将被读取为原始字节。 ( Source )
function readnsIFile(fileName, callback){
var nsiFile = new FileUtils.File(fileName);
NetUtil.asyncFetch(nsiFile, function (inputStream, status) {
// Do not specify a charset at all!
var data = NetUtil.readInputStreamToString(inputStream, inputStream.available());
callback(data, status, nsiFile);
});
}
使用 io/byte-streams
的建议也可以,但请记住该 SDK 模块仍标记为实验性,并且通过 ByteReader
使用 io/file
如示例所示不是一个好主意,因为这将是主线程上的同步 I/O。我真的看不到好处,因为无论如何您都会使用 NetUtil
。
无论如何,这应该有效:
const {ByteReader} = require("sdk/io/byte-streams");
function readnsIFile(fileName, callback){
var nsiFile = new FileUtils.File(fileName);
NetUtil.asyncFetch(nsiFile, function (inputStream, status) {
var reader = new ByteReader(inputStream);
var data = reader.read(inputStream);
reader.close();
callback(data, status, nsiFile);
});
}
另外,请记住,像这样读取大文件是有问题的。显然,整个文件不仅会缓冲在内存中,而且:
char
(字节)数组,所以在流中会有一个至少file.size
长度的临时缓冲区(通过asyncFetch
).NetUtil.readInputStreamToString
和 ByteReader
都将使用另一个 char
(字节)数组从 inputStream< 中读取结果
,但 ByteReader
将以 32K block 的形式执行此操作,而 NetUtil.readInputStreamToString
将使用 file.length
的大缓冲区。jschar
/wchar_t
(字)数组。 Javascript 字符串,即你至少需要 file.size * 2
字节的内存。例如,读取一个 1MB 的文件需要超过 fileSize * 4
= 4MB 内存 (NetUtil.readInputStreamToString
) 和/或超过 fileSize * 3
= 读取操作期间的 3MB 内存 (ByteReader
)。操作后,该内存的 2MB 将仍然存在,以将结果数据存储在 Javascript 字符串中。
读取 1MB 的文件可能没问题,但 10MB 的文件在移动设备(Firefox for Android、Firefox OS)上可能已经存在问题,而 100MB 的文件即使在桌面上也会有问题。
您还可以将数据直接读入ArrayBuffer
(或Uint8Array
),它比Javascript 字符串更有效地存储字节数组并避免临时缓冲区NetUtil.readInputStreamToString
和/或 ByteReader
。
function readnsIFile(fileName, callback){
var nsiFile = new FileUtils.File(fileName);
NetUtil.asyncFetch(nsiFile, function (inputStream, status) {
var bs = Cc["@mozilla.org/binaryinputstream;1"].
createInstance(Ci.nsIBinaryInputStream);
bs.setInputStream(inputStream);
var len = inputStream.available();
var data = new Uint8Array(len);
reader.readArrayBuffer(len, data.buffer);
bs.close();
callback(data, status, nsiFile);
});
}
PS:如果 NetUtil.readInputStreamToString
调用中省略了 charset
选项,MDN 文档可能会说明“iso-8859-1”是默认值,但是文档是错误的。我会修复它。
关于javascript - 使用 Mozilla 附加组件读取原始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23821154/
在更大的应用程序的上下文中,我的小程序需要将一些数据打印到 Zebra 或 Dymo(取决于用户安装的内容)标签打印机。 我收到的数据是转义形式,我只需要发送到打印机并让它解释它的数据。 搜索我找到了
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭去年。 Improve th
我正在尝试使用 GetUserMedia() 从用户麦克风录制和保存声音片段和 AudioContext蜜蜂。 我已经能够使用 MediaRecorder 做到这一点API,但不幸的是,Safari/
我想编写一个将十六进制数据转换为音频文件的小型Web应用程序。 音频文件的数据将采用十六进制格式,如下所示: DA1FFFF8B3AEEE2E23BBB9A2221F10400180001EF1C1E
在其中一个 API 中,我收到以下 Json 响应:您可以在此处查看此响应示例 Sample Json resopnse { "histogram" : { "1" : "12
如何在 python 上使用 Resuests 库发布原始数据?我正在尝试登录。 Json 抛出异常 TypeError: set(['"clienteLogin":{"Token":"b94261f
有人告诉我,无论何时使用字节,都应该将变量声明为无符号字符。在 Windows 的数据类型中,BYTE 被声明为 unsigned char。 我的问题: 为什么? Unsigned 是从 0 到 2
如何读取 GPS 原始数据,更具体地说,我需要卫星伪距。此数据不提供 NMEA 格式。 最佳答案 卫星伪距在 official API 中不可用 ,既不通过 GpsStatus.Listener 也不
给定以下 XML: 1424 我正在尝试获取
我使用了以下代码将十进制的 bigint 转换为 bytearray(原始数据),但我得到了错误的结果。 这里有什么错误吗? 我正在 Apple Mac 中尝试此操作(适用于 Iphone 应用程序)
我在 iOS 应用程序中使用 Firebase 登录时遇到了表格 View 问题。该表从子提要加载内容。当我第一次登录时,表加载正常,但如果我注销并再次登录,表会重新加载所有数据,将原始数据添加到表的
我正在使用 Apache BCEL动态创建 java 类,每个类都有自己的关联图像。这些生成的类实现了以下接口(interface): interface ImageOwner { byte[
有没有办法读取 Sim 卡的“原始”数据?类似于如何使用 Pdu 的 SmsMessage 原始数据读取原始数据? 最佳答案 阅读SIM卡相关信息需要TelephonyManager API . Te
有没有办法在命令行 curl 中将数据 POST 或 GET(插入您最喜欢的 HTTP 方法)数据到 URL 并包含在原始发布的数据 header 值中,而不是发出 -H 选项? 例如: $curl
我正在开展一个项目,尝试使用 Myo Gesture Control Armband 识别一些用于康复治疗的 Action /姿势。 . 我有三个问题: EMG Raw Data 返回的最大值和最小值
我有 flv 文件,其中包含带有 aac 原始数据的音频标签。每个音频标签都有一组 aac 原始数据。原始数据有不同的大小。我想通过 RTP 发送。我添加了 13 位大小的 AU header 。它是
我使用制造商提供的库通过 USB 访问相机。我通过结构接收有关图像的信息: typedef struct { /*! Buffer handle which contains new data
我正在从事 BLE 项目,其中录音机硬件连续流式传输数据并发送到 iOS 应用程序。从 iOS 应用程序端,我需要读取传输的数据。 硬件向 iOS 应用程序发送 HEX 数据,我们需要创建 .mp3/
我正在尝试使用 AFNetworking 发出 HTTP PUT 请求以在 CouchDB 服务器中创建附件。服务器需要 HTTP 正文中的 base64 编码字符串。如何在不使用 AFNetwork
我有一些 Graylog2 使用 syslog 输入插件接收的日志。 我需要以我收到的相同格式导出它们,无需任何解析,以便我可以发送给应用程序支持团队。 我已将 INPUT 设置为保留 full_ma
我是一名优秀的程序员,十分优秀!