У меня есть [u8; 16384]
и u16
. Как бы я «временно трансмутировал» массив, чтобы сразу установить два значения u8
, первый и младший значащий байт, а второй - самый старший байт?Временная трансмутация [u8] на [u16]
ответ
Как предполагает DK, вы, вероятно, не должны использовать код unsafe
, чтобы переосмыслить память. Но вы можете, если хотите.
Если вы действительно хотите, чтобы идти по этому пути, вы должны знать несколько подводных камней:
- Вы можете иметь проблемы с выравниванием. Если вы просто возьмете откуда-нибудь и захотите, чтобы он временно преобразовал его в
&mut[u16]
, он мог бы ссылаться на некоторую область памяти, которая не соответствует , выровненному для доступа кu16
. В зависимости от того, на каком компьютере вы запускаете этот код, такой неприглаженный доступ к памяти может быть незаконным. В этом случае программа, вероятно, будет прервана. Например, процессор может генерировать какой-то сигнал, на который реагирует операционная система, чтобы убить процесс. - Он не переносится. Даже без проблем с выравниванием вы получите разные результаты на разных машинах (маленькие или большие конечные машины).
Если вы можете переключить его вокруг (создание u16
массива и временно справиться с ним на уровне байтов), вы бы решить потенциальную проблему выравнивания памяти:
/// warning: The resulting byte view is system-specific
unsafe fn raw_byte_access(s16: &mut[u16]) -> &mut[u8] {
use std::slice;
slice::from_raw_parts_mut(s16.as_mut_ptr() as *mut u8,
s16.len() * 2)
}
Конечно, на большой endian machine эта функция не делает то, что вы хотите. Вам нужен небольшой порядковый байтовый порядок. Таким образом, вы можете использовать это только как оптимизацию для маленьких конечных машин и должны придерживаться решения, такого как DK для больших/смешанных конечных машин.
Очевидным, безопасным и переносным способом является просто использовать математику.
fn set_u16_le(a: &mut [u8], v: u16) {
a[0] = v as u8;
a[1] = (v >> 8) as u8;
}
Если вы хотите интерфейс более высокого уровня, есть byteorder
ящик, который предназначен, чтобы сделать это.
Вы определенно должны не использование transmute
превратить [u8]
в [u16]
, потому что не гарантирует ничего о порядке байтов.
- 1. U8, U16, представление U32 в python
- 2. Кастинг a Vec <u8> a & [u16]
- 3. Трансмутация хэш-структура
- 4. Почему используется u8 u16 u32 u64 вместо unsigned int в программировании ядра
- 5. Трансмутация нескольких столбцов в dplyr
- 6. как бить сдвинуть данные u16 *?
- 7. Преобразовать U08 * буфер в U16 *
- 8. Рассуждение за буквами u8, u и U string
- 9. Любые программы или скрипты, которые будут добавлять префикс размера (u8, u16 и т. Д.) К имени переменной C
- 10. Accessing & str as & [u8]
- 11. ARM Neon: Производительность vld4.u8 vs 4x vld1.u8
- 12. Ожидаемый параметр типа, найден U8, но параметр тип u8
- 13. Как дублировать фрагмент & [u8]?
- 14. Преобразование str в a & [u8]
- 15. Каков правильный способ записи `Vec <u16>` содержимого в файл?
- 16. Разница между L "" и u8 ""
- 17. Как преобразовать 'struct' в '& [u8]'?
- 18. Как сделать & u8 для usize
- 19. C++: использование необъявленный идентификатор 'u8'
- 20. Временная метка на GoogleSpreadsheet
- 21. Временная виртуализация на linux
- 22. Ожидаемый тип `& Vec <u8>`, `найдено & Vec <&u8>`
- 23. Как использовать новые типы char16_t и u8?
- 24. Разница между u8, uint8_t, __u8 и __be8
- 25. E0277 «Размер не используется для типа [u8]», но у моего типа нет [u8]
- 26. Идиоматические преобразований для струнных, и ул, Vec <u8> и & [u8]
- 27. Как найти подпоследовательность в & [u8] срезе?
- 28. Как напечатать вектор u8 в виде строки?
- 29. Временная проблема на многострочной диаграмме?
- 30. Временная сложность для модификации на
Ну, да, это то, что у меня есть прямо сейчас, но мне было интересно узнать о микрооптимизации, и в любом случае вы не можете использовать '# [cfg (target_endian =" ... ")]' для проверки для байтового заказа? – Shien
@Shien Обычно вы можете получить битрейт, чтобы быть почти оптимальным. Я бы не стал беспокоиться об этом в большинстве случаев использования. – Veedrac
Я не вижу, как ваш ответ действительно заботится о порядке байтов. – Neikos