Перейти к содержанию
    

Вопрос по безопасному заполнению байтового массива

Делаю заполнение хедера wav файла и возник такой вопрос.

Нужно ли маскировать заполнение значений байтового массива? Я думаю что не надо

uint8_t arr[24];

uint_fast32_t value = 0x0A0B0C0D;

// Маска 0xFF
arr[0] = value & 0xFF;
arr[1] = ( value >> 8 ) & 0xFF;
arr[2] = ( value >> 16 ) & 0xFF;
arr[3] = ( value >> 24 ) & 0xFF;

// Без маски
arr[4] = value;
arr[5] = value >> 8;
arr[6] = value >> 16;
arr[7] = value >> 24;

Но есть ли в случае присвоения без маски 0xFF подводные камни? Мне тактов на маскирование не жалко, но любопытно как 100% правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, kochevkv сказал:

Но есть ли в случае присвоения без маски 0xFF подводные камни? Мне тактов на маскирование не жалко, но любопытно как 100% правильно.

Нету. "& 0xFF" не нужно. И скорее всего - ваш компилятор и так его выкидывает. Если не совсем уж глупый. Советую хоть иногда заглядывать в листинг.

PS: У вас же не DSP наверняка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, jcxz said:

Нету. "& 0xFF" не нужно. И скорее всего - ваш компилятор и так его выкидывает. Советую хоть иногда заглядывать в листинг.

Листинг листингу рознь. Мало ли что там один компилятор сделает и с какими опциями.

Да, я что-то вообще тему создал не подумав. Я же все равно присваиваю байту в массиве 32 битное значение хоть и заполненное нулями после 8-го бита и ничего, не переживаю. Тему можно удалить)

5 minutes ago, jcxz said:

Нету. "& 0xFF" не нужно. И скорее всего - ваш компилятор и так его выкидывает. Если не совсем уж глупый. Советую хоть иногда заглядывать в листинг.

PS: У вас же не DSP наверняка.

DSP. А что это меняет?

Изменено пользователем kochevkv

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, kochevkv сказал:

DSP. А что это меняет?

Вообще-то при таких вопросах следует указывать - о каком CPU идёт речь? В обязательном порядке.

Меняет это то, что во многих DSP не существует нативного байтового типа. И если у вас такой DSP, то непонятно - как именно реализован ваш uint8_t? В зависимости от его реализации, на таких DSP операция "& 0xFF" может быть необходима. При кривой реализации uint8_t.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, jcxz said:

Вообще-то при таких вопросах следует указывать - о каком CPU идёт речь? В обязательном порядке.

Меняет это то, что во многих DSP не существует нативного байтового типа. И если у вас такой DSP, то непонятно - как именно реализован ваш uint8_t? В зависимости от его реализации, на таких DSP операция "& 0xFF" может быть необходима. При кривой реализации uint8_t.

Да не, не кривой у нас uint8_t 🙂 все как надо, 8 бит, всё как у людей

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, Arlleex said:

Значит не надо.

В нашем случае да, не надо. Но вот @jcxz нашел вариант когда надо. Но, насколько я понимаю, uint8_t не должен быть кривым. Т.е. он либо есть либо его нет. если нет, то надо использовать uint_least8_t и уже переписывать что есть. если б 9 битные байты встречались часто, то имело бы смысл сразу писать с маской чтобы не переписывать под разные платформы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

34 минуты назад, kochevkv сказал:

Да не, не кривой у нас uint8_t 🙂 все как надо, 8 бит, всё как у людей

А у DSP сколько бит? (минимальная разрядность обращения к памяти)

Только что, kochevkv сказал:

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

Не "9-битные байты", а минимальная разрядность обращения к памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если шины АЛУ позволяют работать с байтовым доступом, а в наборе инструкций есть однобайтовые инструкции, и компилятор их может использовать, то никаких проблем не будет. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 minutes ago, jcxz said:

А у DSP сколько бит? (минимальная разрядность обращения к памяти)

32 битный, Blackfin BF548. Но обращаться в программе к памяти могу и побайтно. Но листинг не смотрел ещё. Сейчас попробую.

image.png.a81030abbed269f26a07c2f11dfb4f80.png

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

Изменено пользователем kochevkv

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 минуты назад, jcxz сказал:

А у DSP сколько бит? (минимальная разрядность обращения к памяти)

Это пусть компилятор знает, Си-программе это зачем? Если бы ТС писал просто char, то еще понятно - он может быть разным. Но псевдонимы точной ширины, как uint8_t, компилятор должен знать как правильно обрабатывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, kochevkv сказал:

в случае присвоения без маски 0xFF подводные камни?

Если переменная, которой присваивается новое значение, объявлена как 8-ми битная, то не нужно никаких масок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

47 minutes ago, jcxz said:

Не "9-битные байты", а минимальная разрядность обращения к памяти.

Я даже не знаю как этот параметр искать) я так понимаю, о таких особенностях отдельно пишут в даташите на первой странице. 8 бит должно быть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Arlleex сказал:

Это пусть компилятор знает, Си-программе это зачем? Если бы ТС писал просто char, то еще понятно - он может быть разным. Но псевдонимы точной ширины, как uint8_t, компилятор должен знать как правильно обрабатывать.

Про что я и говорил:

2 часа назад, jcxz сказал:

непонятно - как именно реализован ваш uint8_t?

Мы ведь исходников ТС не видели. И не знаем - как он там описал этот самый uint8_t.

uint8_t - это не встроенный тип си. А значит может быть описан как угодно.

1 час назад, kochevkv сказал:

Я даже не знаю как этот параметр искать) я так понимаю, о таких особенностях отдельно пишут в даташите на первой странице. 8 бит должно быть.

Например у DSP семейства C55xx (TI) нет команд байтового обращения к памяти. Минимум = 16 бит. Да и вся память там - не пространство байт, а пространство 16-битных слов. Значит - как бы вы не описывали там этот самый uint8_t, он будет работать или посредством 16-битных обращений к памяти; или посредством операций чтения-модификации-записи. И то и другое может вызывать проблемы в определённых случаях.

А искать надо в описании системы команд. Также можно обратить внимание на размер char в вашем компиляторе. Скорее всего его размер будет равен минимально-возможной ширине доступа к памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, jcxz said:

Мы ведь исходников ТС не видели. И не знаем - как он там описал этот самый uint8_t.

uint8_t - это не встроенный тип си. А значит может быть описан как угодно.

Не, я, конечно, его сам не описываю. Он в stdint.h описан как char. Еще и под #ifdef _BYTE_BITS == 8 (примерно, на память). Т.е. если бит не 8 то его и не будет вообще.

Приставка std не значит что файл должен быть в стандарте?

Изменено пользователем kochevkv

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...