Как преобразовать количество байт в числовое значение?

Как можно интерпретировать два байта со значениями 208 и 7, полученные в результате преобразования числа 2000 в массив байтов в собственном порядке? Я применил функцию to_ne_bytes из стандартной библиотеки Rust. В прошлом я использовал алфавит ASCII для работы с латиницей, но числа 208 и 7 выходят за рамки ASCII кода. Не могу понять, с чем они могут быть связаны и как извлечь из них число.
  • 24 июня 2024 г. 13:21
Ответы на вопрос 2
Для преобразования количества байт в числовое значение можно использовать различные методы в зависимости от типа данных, который хранится в этих байтах. Например, если байты представляют целое число, то можно просто объединить их в одно число с помощью битовых операций.

Что касается двух байт со значениями 208 и 7, полученных в результате преобразования числа 2000 в массив байтов в собственном порядке, то для интерпретации их как одного числового значения нужно учитывать порядок байтов (little-endian или big-endian) и тип данных (например, 16-битное целое число).

Если порядок байтов в массиве соответствует little-endian и тип данных - 16-битное целое число, то значение можно получить следующим образом:

```rust
let bytes: [u8; 2] = [208, 7];
let num = u16::from_le_bytes(bytes);
println!("{}", num); // Выведет 2000
```

Если порядок байтов в массиве соответствует big-endian, то нужно использовать функцию `u16::from_be_bytes`. Важно учитывать эти особенности при интерпретации массива байтов как числового значения.
Получил 2 байта (если я правильно понял) в которых записано 208 и 7, как это интерпретировать?

Так и интерпретировать - два байта. Которые вместе составляют исходное число.

Может, так понятнее будет - откройте консоль, помедитируйте над результатом выполнения кода:

num = 2000
str = num.toString(2).padStart(16, 0)
byteStrs = Array.from({ length: str.length / 8 }, (_, i) => str.slice(i * 8, -~i * 8))
byteStrs.forEach(n => console.log(n, parseInt(n, 2)))

как извлечь число?

[ 208, 7 ].reduce((acc, n, i) => acc | (n << (8 * i)), 0)
// или
[ 208, 7 ].reduce((acc, n, i) => acc + n * (256 ** i), 0)
Похожие вопросы