2017-02-23 91 views
-1

Я новичок в этом, так что, возможно, задаем основной вопрос. У меня есть массив поплавкиузел js, как писать/читать целые числа в двоичном файле?

[1.3, 2.0, 10, 9.8, ... ] . //let's say length = 10 

, которые я хочу сохранить в бинарном файле. Я хочу написать в следующем формате

10 1.3 2.0 10 9.8, ... 

так что, когда я загрузить файл позже, я сначала прочитал длину 10, а затем прочитать парит в 10 раз.

Я думаю, что это экономит место и должно быть быстрее, чем просто писать/читать его как текст.

До сих пор я нашел немного информации о двоичном файле в node.js.

var fs = require('fs'); 
    var wstream = fs.createWriteStream('myBinaryFile'); 
    var buffer = crypto.randomBytes(100); 
    wstream.write(buffer); 
    wstream.end(); 

, где я не знал, как я могу записать свои номера в буфер и записать буфер в файл.

Кроме того, я прочитал некоторые документы, в которых буфер в узле имеет только целое число 0 ~ 255, и значит ли это, что он не может обрабатывать целые числа, превышающие 255?

Например, как я могу писать/читать Массив

[11000, 24535, 92833, 45353, ... ] 

в/из двоичного файла.

Я думаю, мне нужно немного руководства, поэтому здесь я ищу помощь. Пожалуйста, укажите, что я должен делать, спасибо!

ответ

1

Вам необходимо использовать Buffer (или стандартный Uint8Array, но поскольку это node.js, я буду использовать Buffer). Вы можете в принципе выяснить, что вам нужно сделать, прочитав документы, но я опишу, что вам нужно сделать, чтобы дать вам начало.

Прежде всего, необходимо принять несколько решений.

  1. Вы хотите, чтобы ваше целое число составляло 8 бит или 16 бит или 32 бит или 48 бит? (да, узел поддерживает 48-битные int, но не 64 - вероятно, потому, что числа в js удваиваются с 52-битной мантиссой, поэтому 64-битный int не может быть точно преобразован в число). Кроме того, если вам нужны номера с плавающей запятой, вы хотите, чтобы поплавки (32 бита) или удваивались (64 бит)?

  2. Вы хотите сохранить номер на диске в виде большого эндиана или маленького конца? FWIW, программисты, как правило, предпочитают, чтобы маленькие эндианские и аппаратные дизайнеры, как правило, предпочитали большой эндиан. Не имеет значения, но быть последовательным. Не смешивайте континент в одном файле.

Теперь, когда вы решились, давайте сделаем пример. Скажем, например, вы хотите сохранить два 32-битных ints и один double в файле. Необходимое пространство: 32 + 32 + 64 = 128 bits = 16 bytes. Так что вам нужно 16 байт буфера (да, буферы работать на уровне байтов, вы в основном временно повышен быть C программист):

var b = Buffer.alloc(16); 

Теперь давайте хранить эти цифры.Допустим, вы решили хранить их как Little Endian:

var x = 12345; 
var y = 54321; 
var z = 1.234; 

b.writeInt32LE(x,0); // write x to bytes 0-3 
b.writeInt32LE(y,4); // write y to bytes 4-7 
b.writeDoubleLE(z,8); // write z to end of buffer 

Теперь вы можете записать значение буфера b в файл, используя любой из функций фс записи. Обратите внимание, что вы должны установить кодировку в "binary", потому что по умолчанию кодировка fs-функций является utf8, которая может попытаться проанализировать ваши данные и испортить их.

Для чтения значений из файла вы сделаете то же самое в обратном порядке. Используйте функции buffer.read.... Опять же, не забудьте установить кодировку в "binary" (или это был «буфер»?) При чтении файла с диска.

+0

Следует отметить, что в приведенном выше примере мы закодировали 3 числа, которые занимают 15 байт в строковой форме (17, если вы хотите добавить пробелы между ними) и сохраните их как 16 байтов двоичного значения. Двоичные файлы не всегда выигрывают вас за счет того, что вам сложнее отлаживать – slebetman

Смежные вопросы