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
, SignedShort
, Word
, 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
. Если эта переменная имеет значение, файл создается в соответствующей директории. В противном случае файл создается в “рабочей директории”.
Запишите последовательность чисел в файл 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)
Используйте 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:
Используйте 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:
Ошибка выдана, если данные не совпадают с заданным форматом. Здесь, -5
не совпадает с Byte
. Этот формат не включает отрицательные числа:
writebytes("test.tst", [42, 17, -5, 7], Byte)
Error: Invalid argument. [writebytes]
Вот то, что происходит, если количество байтов в файле не совпадает с кратным модулям заданного формата. Поскольку и SignedShort
и Float
состоят из четного числа байтов, запаздывающий 5-й байт, соответствующий 11
, проигнорирован:
writebytes("test.tst", [42, 17, 7, 9, 11], Byte): readbytes("test.tst", SignedShort), readbytes("test.tst", Float)
Задайте порядок байтов при помощи 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:
Запишите элементы 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:
Запишите 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:
Предположим, что у вас есть 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:
|
Имя файла: символьная строка |
|
Дескриптор файла обеспечивается |
|
Список цифр MuPAD, которые будут записаны в файл. Записи должны совпадать с заданным |
|
Массив типа |
|
Формат двоичных данных, заданных как |
|
Формат двоичных данных. Форматом по умолчанию является Байт является 8-битным двоичным числом. Поэтому байт может иметь 28 различных значений. Для С С
“Коротким” является 16-битное двоичное число (2 байта). Поэтому “короткое” может иметь 216 различных значений. Для Семантика “Слово” является 32-битным двоичным числом (4 байта). Поэтому “слово” может иметь 232 различных значения. Для Семантика Формат двоичных данных. Форматом по умолчанию является “Плавание” является 32-битным представлением вещественного числа (4 байта). “Двойным” является 64-битное представление вещественного числа (8 байтов). ПримечаниеПлавания и удваиваются, читаются/пишутся в формате машины/операционной системы, на которой в настоящее время работает MuPAD. Поэтому результаты могут отличаться между другими платформами. Двоичные файлы, содержащие числа с плавающей запятой, являются, в целом, не портативными на другие платформы. Смотрите флаги Смотрите Пример 1 для обзора по опциям другого формата. |
|
Порядок байтов: или
Для всех форматов данные написаны в 8-битных блоках (байты). Это также включает форматы, где модуль более длинен, чем один байт (все форматы, но Если, например,
Смотрите Пример 6 для эффектов |
|
Запишите двоичные данные в любом случае, даже если числа не совпадают с данным форматом. Если опция Если данное значение не соответствует формату определенных данных, записанное значение не задано. Например, 53 425,00 записанных как |
Пустой объект null()
типа DOM_NULL
.