writebytes

Запись двоичных данных в файл

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразуют Notebook MuPAD в Live скрипты MATLAB.

Синтаксис

writebytes(filename | n, list | hfarray, <format>, <BigEndian | LittleEndian>, <Force>)

Описание

writebytes(file, list) написал список чисел MuPAD® к файлу.

writebytes(file, hfarray) пишет массив типа DOM_HFARRAY к файлу.

writebytes позволяет вам записать произвольные файлы и интерпретировать их содержимое как последовательность чисел.

Результаты writebytes зависьте от интерпретации двоичных данных, установленных format опция. При записи в файл можно интерпретировать его как поток Byte, SignedByte, Short, SignedShortWord, SignedWord, Float или Double. Это стандартные форматы, используемые многими пакетами программы, чтобы записать данные. Смотрите Пример 1.

Эта функция особенно полезна, когда вы работаете над данными, обеспеченными или предназначенный для внешних программ. Например, можно использовать его, чтобы реализовать алгоритмы шифрования или алгоритмы сжатия в MuPAD. Смотрите Пример 2.

Можно задать файл непосредственно его именем. Если имя файла задано, writebytes создает новый файл или перезаписывает существующий файл. Если имя файла задано, writebytes также открывает и закрывает файл автоматически. Если WRITEPATH не имеет никакого значения writebytes интерпретирует имя файла как путь относительно “рабочей директории”. Абсолютные пути обрабатываются writebytes, также.

Примечание

Значение “рабочей директории” зависит от операционной системы. В системах Microsoft® Windows® и в системах Mac OS X, “рабочая директория” является папкой, где MuPAD установлен. В системах UNIX® это - текущая рабочая директория, в которой был запущен MuPAD; когда запущено с меню или настольного элемента, это обычно - корневой каталог пользователя.

Если имя файла задано, каждый вызов writebytes открывает файл вначале. Если файл был открыт через fopen, последующие вызовы writebytes с соответствующим дескриптором файла запускаются в точке в файле, который был достигнут последним writebytes команда. Следовательно, если вы хотите записать файл фрагментами, необходимо открыть его с fopen и используйте возвращенный дескриптор файла вместо имени файла. Смотрите Пример 3.

Примечание

Если файл должен быть открыт через fopen, обязательно передайте флаг Raw к fopen. В противном случае, writebytes выдает ошибку.

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

При записывании данные через writebytes, каждая запись в списке проверяется на то, может ли это быть преобразовано в заданный формат. Если дело обстоит не так, writebytes выдает ошибку. Смотрите Пример 4.

При записи массива типа DOM_HFARRAY, только Double позволен как двоичный формат. Если никакому параметру формата не дают, такие массивы записаны, как удваивается. Смотрите Пример 7.

Если массив типа DOM_HFARRAY с комплексными числами записан в файл, затем сначала действительные части элементов записаны, и затем комплексные части записаны в файл. Поскольку readbytes может только считать действительные значения, сначала нужно создать действительное и затем комплексную часть, чтобы восстановить комплексный массив. Смотрите Пример 9.

Взаимодействия среды

Функциональный writebytes чувствительно к переменной окружения WRITEPATH. Если эта переменная имеет значение, файл создается в соответствующей директории. В противном случае файл создается в “рабочей директории”.

Примеры

Пример 1

Запишите последовательность чисел в файл test.tst с настройками по умолчанию. Затем загрузите их, въезжайте задним ходом:

writebytes("test.tst", [42, 17, 1, 3, 5, 7, 127, 250]):
readbytes("test.tst")

Считайте вышеупомянутые данные с некоторой другой опцией: SignedByte интерпретирует все значения от 0 до 127 точно как Byte делает. Более высокие значения x, однако, интерпретированы как x - 256. Например, 250 - 256 = - 6:

readbytes("test.tst", SignedByte)

Short интерпретирует два байта, чтобы быть одним номером. Поэтому восемь записанных байтов интерпретированы как четыре числа. Например, первый 2-байтовый урожай 42 28 + 17 = 10769:

readbytes("test.tst", Short)

С флагом LittleEndian, порядок байтов инвертируется. Например, первые 2 байта теперь уступают 17 28 + 42 = 4394:

readbytes("test.tst", Short, LittleEndian)

Word интерпретирует четыре байта, чтобы быть одним номером. Поэтому восемь записанных байтов дают два числа. Первый 4-байтовый урожай 10769 216 + 259 = 705757443:

readbytes("test.tst", Word)

Double интерпретирует восемь байтов, чтобы представлять одно число с плавающей запятой. Интерпретация является зависимым машины и может отличаться для вас:

readbytes("test.tst", Double)

Пример 2

Используйте readbytes и writebytes зашифровать файл, созданный в предыдущем примере с простым “кодированием типа Цезаря”: Любой целочисленный x (байт) заменяется x + 13 mod 256:

L := readbytes("test.tst"): 
L := map(L, x -> (x + 13 mod 256)):
writebytes("test.tst", L):

Зная шифрование и его ключ, можно успешно дешифровать файл:

L := readbytes("test.tst")

map(L, x -> (x - 13 mod 256))

delete L:

Пример 3

Используйте fopen записать и считать файл во фрагментах:

n := fopen("test.tst", Write, Raw):               
for i from 1 to 10 do writebytes(n, [i]) end_for: 
fclose(n):

Эквивалентно, можно записать все данные сразу:

n := fopen("test.tst", Write, Raw):               
writebytes(n, [i $ i = 1..10]):
fclose(n):

Считайте байт данных байтом:

n := fopen("test.tst", Read, Raw): 
readbytes(n, 1), readbytes(n, 1), readbytes(n, 1);
fclose(n):

Следующая команда читает во фрагментах 5 байтов каждого:

n := fopen("test.tst", Read, Raw): 
readbytes(n, 5), readbytes(n, 5);
fclose(n):

delete n, i:

Пример 4

Ошибка выдана, если данные не совпадают с заданным форматом. Здесь, -5 не совпадает с Byte. Этот формат не включает отрицательные числа:

writebytes("test.tst", [42, 17, -5, 7], Byte)
Error: Invalid argument. [writebytes]

Пример 5

Вот то, что происходит, если количество байтов в файле не совпадает с кратным модулям заданного формата. Поскольку оба SignedShort и Float состойте из четного числа байтов, запаздывающего 5-го байта, соответствующего 11 проигнорирован:

writebytes("test.tst", [42, 17, 7, 9, 11], Byte):
readbytes("test.tst", SignedShort), 
readbytes("test.tst", Float)

Пример 6

Задайте порядок байтов при помощи BigEndian и LittleEndian:

writebytes("test.tst", [129, 255, 145, 171, 191, 253], Byte):
L1 := readbytes("test.tst", Short, BigEndian)

L2 := readbytes("test.tst", Short, LittleEndian)

Посмотрите на данные в бинарном представлении. (См. numlib::g_adic для деталей). Эффект использования LittleEndian вместо BigEndian должен обмениваться первыми 8 битами и последними 8 битами каждого номера:

map(L1, numlib::g_adic, 2)

map(L2, numlib::g_adic, 2)

delete L1, L2:

Пример 7

Запишите элементы DOM_HFARRAY к файлу. Все элементы являются значениями с двойной точностью и writebytes не позволяет писать элементы массива в другом формате, чем Double.

A:=hfarray(1..2,1..6,
   [   0.2703,   12.8317, -33.1531, 9999.9948, 0.2662,  -14.3421, 
    1000.1801,    0.4521, -34.6787,  -67.3549, 0.6818,   13]):
writebytes("test.tst", A):

Но если мы попытаемся записать элементы как байты, то мы получим ошибку.

writebytes("test.tst", A, Byte);
Error: Invalid argument. [writebytes]
delete A:

Пример 9

Запишите DOM_HFARRAY с комплексными числами к файлу и попытке восстановить его путем чтения данных.

A := hfarray(1..2, 1..3,
             [[2342.133 + 56*I, -342.56, PI + I],
              [           -3*E, I^2 + I,     13]]);
writebytes("test.tst", A);
fd := fopen("test.tst", Read, Raw):   
B := readbytes(fd, ReturnType = [DOM_HFARRAY, 2, 3]);
C := readbytes(fd, ReturnType = [DOM_HFARRAY, 2, 3]);
bool(A = B + C*I);
flose(fd):

delete A, B, C, fd:

Пример 10

Предположим, что у вас есть DOM_HFARRAY с записями, которые являются целыми числами между-32768 и 32767 и мы хотим записать эти данные как SignedShort к файлу. Если вы пробуете его без опции Force, вы получите ошибку потому что число с плавающей запятой типа DOM_FLOAT не может быть записан как SignedShort. С опцией Force, writebytes попытки преобразовать число с плавающей запятой в слово со знаком и записи это в любом случае к файлу.

A:=hfarray( 1..2,1..3, [[234,-32768,1],[32767,-12111,-3]]);
writebytes("test.tst", SignedShort, A):

Error: Invalid argument. [writebytes]
writebytes("test.tst", SignedShort, Force, A):
l:= readbytes("test.tst", SignedShort);
op(A,i)-l[i] $i=1..6;

delete A, l:

Параметры

filename

Имя файла: символьная строка

n

Дескриптор файла обеспечивается fopen: положительное целое число. Файл, должно быть, был быть открытым с помощью fopen- флаг Raw.

list

Список цифр MuPAD, которые будут записаны в файл. Записи должны совпадать с заданным format.

hfarray

Массив типа DOM_HFARRAY.

format

Формат двоичных данных, заданных как Byte, SignedByte, Short, SignedShortWord, SignedWord, Float, и Double.

Опции

Byte, SignedByte, Short, SignedShort, SignedWordWord'double', Float

Формат двоичных данных. Форматом по умолчанию является Byte.

Байт является 8-битным двоичным числом. Поэтому байт может иметь 28 различных значений. Для Byte, это целые числа от 0 до 255. Для SignedByte, они - целые числа от - от 128 до 127.

С Byte, данные читаются/пишутся в 8-битных блоках, интерпретированных как байты без знака. При записи числа проверяются на то, что они были в диапазоне от 0 до 255.

С SignedByte, данные считаны или записаны с помощью с 2 дополнениями.

Byte формат по умолчанию.

“Коротким” является 16-битное двоичное число (2 байта). Поэтому “короткое” может иметь 216 различных значений. Для Short, это целые числа от 0 до 65 536. Для SignedShort, они - целые числа от - от 32768 до 32 767.

Семантика Short или SignedShort походит на тот из Byte или SignedByte, соответственно.

“Слово” является 32-битным двоичным числом (4 байта). Поэтому “слово” может иметь 232 различных значения. Для Word, это целые числа от 0 до 4294967296. Для SignedWord, они - целые числа от - 2147483648 - 2 147 483 647.

Семантика Word или SignedWord походит на тот из Byte или SignedByte, соответственно.

Формат двоичных данных. Форматом по умолчанию является Byte.

“Плавание” является 32-битным представлением вещественного числа (4 байта). “Двойным” является 64-битное представление вещественного числа (8 байтов).

Примечание

Плавания и удваиваются, читаются/пишутся в формате машины/операционной системы, на которой в настоящее время работает MuPAD. Поэтому результаты могут отличаться между другими платформами.

Двоичные файлы, содержащие числа с плавающей запятой, являются, в целом, не портативными на другие платформы.

Смотрите флаги BigEndian и LittleEndian для получения дополнительной информации о порядке байтов.

Смотрите Пример 1 для обзора по опциям другого формата.

BigEndian, LittleEndian

Порядок байтов: любой BigEndian или LittleEndian. Упорядоченным расположением по умолчанию является BigEndian.

BigEndian и LittleEndian задайте порядок, в котором байты располагаются для Short, SignedShortWord, SignedWord, Float, и Double.

Для всех форматов данные написаны в 8-битных блоках (байты). Это также включает форматы, где модуль более длинен, чем один байт (все форматы, но Byte и SignedByte). С BigEndian, байты со старшими значащими битами (“высокие биты”) записаны сначала. С LittleEndian, байты с младшими значащими битами записаны сначала.

Если, например, Short выбран, существует 16 битов, которые должны быть записаны. Если вы передаете BigEndian, сначала байт с битами для от 215 до 28 и затем байт с битами для от 27 до 20 записаны. Если вы задаете LittleEndian, порядок байтов инвертируется.

BigEndian и LittleEndian не окажите влияние если форматы Byte или SignedByte заданы.

BigEndian порядок байтов по умолчанию.

Смотрите Пример 6 для эффектов BigEndian и LittleEndian.

Force

Запишите двоичные данные в любом случае, даже если числа не совпадают с данным форматом.

Если опция Force установлен, данные написаны в данном формате, например, Byte даже если у них нет правильного формата. Например, 100.00 DOM_FLOAT и обычно writebytes только пишут эти данные, если форматом является Float или Double. С опцией Force значение записано как Byte. См. пример 10.

Если данное значение не соответствует формату определенных данных, записанное значение не задано. Например, 53 425,00 записанных как Byte может быть 177, который является 53425.00 mod 256 или всего 0. Но наверняка 100.00 записан как 100.

Возвращаемые значения

Пустой объект null() из типа DOM_NULL.

Смотрите также

Функции MuPAD