Здравствуйте, rudzuk, Вы писали:
R>Не знаю что мешает, вот второй исходник и точно такая же наркомания: https://github.com/tl8roy/spritz_cipher/blob/704da9bd8546871d07a51ca14c4080e3a083d037/src/lib.rs#L165
Да нашел что мешает, переполнение безнаковых целочисленных в расте. В си просто такое переполнение игнорируется и считает по модулю. Но почему трудолюбивый автор раст кода везде использует wrapping_add когда есть удобная обертка
Wrapping непонятно. С ней можно сделать так:
use std::num::Wrapping;
fn main() {
// начальные переменные
let s:[u8; 256] = [10; 256];
let (i, j, k, z) = (250u8, 250u8, 250u8, 250u8);
// заворачиваем (если операция частая можно макрос сварганить).
let (i, j, k) = (Wrapping(i), Wrapping(j), Wrapping(k));
let mut z = Wrapping(z);
// сам код
let S = |a: Wrapping<u8>| Wrapping(s[a.0 as usize]);
z = S(j + S(i + S(z + k)));
// разворачиваем результат
let z = z.0;
dbg!(z);
}
тут
И судя по его коду по твоей ссылке можно было не обертывать при каждом использовании а сразу объявить переменные как Wrapping<u8> тогда свертки развертки не нужны. В таком случае все совсем просто будет, практически как на си:
use std::num::Wrapping;
fn main() {
// начальные переменные
let s = [Wrapping(10u8); 256];
let (i, j, k) = (Wrapping(250u8), Wrapping(250u8), Wrapping(250u8));
let mut z = Wrapping(250u8);
// сам код
let S = |a: Wrapping<u8>| s[a.0 as usize];
z = S(j + S(i + S(z + k)));
dbg!(z);
}
R>Покажи уже, как правильно и без потери производительности.
Судя по ассемблерному коду
тут оптимизируется вусмерть.
FR>> И также что мешает в си засунуть все переменные в структуру (для получения "красивого" self->) и вместо макроса зафигарить такую же красоту по месту как в раст примере?
R>R>#define smem(x) s->mem[ (x) & 0xff ]
R>...
s->>z = smem (s->j + smem (s->i + smem (s->z + s->k)))
R>
R>Ничто не мешает И читаемость не страдает, как по мне.
Ну нет для полноты картины надо без макроса, как автор кода на расте, мы же на стили хотим посмотреть.
R>Тут демонстрация того, что в раст встроен обфускатор на уровне языка. Ну правда, ведь невозможно же код читать И это примитивное выражение, а если на метод update посмотреть...
Тут похоже демонстрация не очень хорошего знания языка автором кода, с таким знанием он и на си без макросов трудолюбиво бы все расписал.