/ / Бінарні файли і шестигранні редактори - MATLAB, двійкові, шістнадцяткові

Двійкові файли та шестнадцатеричні редактори - matlab, binary, hex

Я намагаюся краще зрозуміти структуру двійкових файлів. Я написав наступний код для запису в беззнакові цілі числа 8 біт у двійковий файл у MATLAB (у Windows)

x = uint8(2^3); % 00010000
fid = fopen("test.bin","w");
fwrite(fid, x);
fclose(fid);

Потім я перейшов до шестнадцатеричного редактора і відкрив файл. Як і очікувалося, я бачу зайнята кішка

Тепер я намагаюся написати двобайтовий довгий тип uint16

x = uint16(2^8); % 0000000100000000
fid = fopen("test.bin","w");
fwrite(fid, x,"uint16");
fclose(fid);

Замість того щоб бачити 01 00, я просто бачу 00 .

Відповіді:

0 для відповіді № 1

Загалом (0x10 означає 10 як шістнадцяткове число, яке є десятковим числом 16):

 2^3 = 2³ = 8 = 0x08
2^4 = 16 = 0x10

Я не думаю, що ви робите те, що ви думаєте, що ви робите. 2 ^ 3 не 2 * 2 * 2 в C (і, ймовірно, Matlab з ваших результатів).

Рішення: (у C): 2 << 3 = 2 * (2 * 2 * 2) = 10000 = 16 = 0x10

Пояснення:

У C (не знаю про Matlab):

2 << 3 означає: 10 << 000 = 10000 = 16 = 0x10.

Кожен << 1 означає "додавання нуля за двійковим числом", що дорівнює еквіваленту до 2 (* 2). Це також працює в іншому напрямку >> 1 те ж саме, що і поділ на 2 (/ 2).

2 ^ 3 означає не 2³ (Експонента), але BINARY AND.

Ти робиш:

2 is binary 10
3 is binary 11

11 & 10 = 10

10
11
--
10

Один під одним означає Один, нуль під одним означає 0. Один і Один - Один. Zero і One - Zero. Або більш формальний: (true ^ false) = false.

Ймовірно, чому 2 ^ 8 не працює.

0010 (2) & 1000 (8) = 0000

 0010
1000
----
0000

Немає 1 під 1, так це все 0.