Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Резюме для программиста

09.08.21 22:41
Re: Резюме для программиста
 
alex445 местный житель
в ответ uscheswoi_82 09.08.21 17:27, Последний раз изменено 09.08.21 23:17 (alex445)
Если вам трудно найти работу, то лучше идти как я на пенсию

Я ещё в Германии толком не пытался - только начинаю. Мне никто пенсию не даст - мне ещё 40 нет. ))


Вот почему интересно вам не запрещают писать так много, а меня постоянно тут затыкают и выгоняют?

Да я, вроде, пару-тройку раз в день пишу в своих темах в основном. До этого полгода не писал.


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

В зависимости от того, соблюдаются или не соблюдаются конвенции по передаче данных по сети, решение будет отличаться. Вот тут написано

"A common convention is to transmit data in network byte order".

Т.е., как я понимаю, порядок передаваемых байт по этой конвенции задаёт сервер. Если у меня плата Лабвью и мой компьютер подсоединены через маршрутизатор - то маршрутизатор (точнее, endianness его процессора) и задаёт порядок байт.


В самом общем случае, когда конвенции не соблюдаются (или неизвестно, соблюдаются они или нет), а также никакой договорённости с узлом сети, с которым вы общаетесь, о порядке байт или как его узнать нет, то невозможно с первого раза правильно расшифровать сообщения другого узла. Нужны тесты - до тех пор, пока сообщения не станут осмысленными (т.е. вам удалось правильно их расшифровать). Но в самом общем случае, когда узел не посылает вам тестовых сообщений (типа хотя бы 16-битной единицы, у которой вы можете взять первый байт и посмотреть - 01 он или 00), а каков истинный смысл сообщений вы не знаете (т.е. вам не с чем сравнить правильность расшифровки), то задача становится не решаемой в принципе - т.е. написать наиболее универсальный код, подходящий для любого случая, невозможно.


Т.е. либо мы соблюдаем общепринятые конвенции (общаемся в порядке байт сети), либо у нас есть свои договорённости (типа первого тестового сообщения). В зависимости от этого будет немного отличаться и решение. Если мы соблюдаем конвенции, то просто передаём данные в сеть в её порядке байт. У C# для трёх типов данных есть для этого встроенные функции, типа таких IPAddress.HostToNetworkOrder Method (System.Net) | Microsoft Docs

Если надо для других типов, типа uint или ещё чего-то, то лучше узнать порядок байт сети и потом реверснуть его "руками". Варианты реверса - от банального метода Reverse по коллекции байт, до побитовых сдвигов Reverse Bytes (Little/Big Endian) [C#] (csharp-examples.net) (опять же, побитовый сдвиг для других типов данных должны написать сами). Мне проще использовать Reverse по коллекции, чем руками двигать битики. Если же речь идёт о сверхпроизводительной системе, которая должна с максимальной эффективностью общаться по сети с правильными сдвигами байт, то лучше, наверное, написать такой модуль кода общения по сети на другом языке, а не на C#. Из C# можно вызывать этот модуль.


Как узнать порядок байт сети? Я не нашёл готовой встроенной функции в C#. BitConverter.IsLittleEndian даёт порядок байт текущей машины (хоста), IPAddress.HostToNetworkOrder даёт сразу число в порядке байт сети, но не отвечает на вопрос, какой порядок байт сети (хотя внутри себя наверняка это выясняет). Т.е. вы должны узнать порядок байт хоста, взять любое тестовое число на хосте и привести его к порядку байт в сети. Далее побитово сравнить его (или просто сравнить числа) с тестовым числом на хосте и если они равны, то порядок байт сети равен порядку байт хоста. Теперь мы знаем, надо ли реверсировать все данные при отправке их в сеть. Соответственно, код моего фрагмента переписывается через if(порядок байт сети равен порядку байт хоста).


Далее можно поспорить, нужно ли реверсировать через IEnumerable.Reverse или через Array.Reverse, нужно ли конкатенацию делать через IEnumerable или через Array.Copy, но меня уже достало писать. ))) Если производительность не важна и IEnumerable отрабатывает достаточно быстро и не ест много памяти, то проще использовать его, т.к. это читабельнее. В нашем случае поток данных был не сильно большим, общение с платой по сети не было узким местом, поэтому я оставил как есть. Итого по улучшению кода - только добавить определение порядка байт сети и соответственно определять, реверсировать ли данные или нет.


Проблема только в том, что человек, который писал код для Лабвью, про порядок байт не слышал (как я понял), и писать с учётом этой особенности не хотел, хотя я ему про это говорил. У него как-то работало на его плате и машине, и он был доволен. Поэтому я просто подстроился под него (и его железо) и написал, что реверсировать байты буду всегда, без определения порядка байт. Если его код для Лабвью начнёт работать на другом процессоре, где порядок байт не такой, как на ARM, всё сломается.

 

Перейти на