Сокращение кода C до 7 битов
У меня есть некоторый код, который я пытаюсь использовать для сетевых коммуникаций, чтобы получить информацию из C++ в MATLAB. Я использую программу pnet (файл mex из c) из открытого обмена Mathworks: https://www.mathworks.com/matlabcentral/fileexchange/345-tcp-udp-ip-toolbox-2-0-6?s_tid=answers_rc2-2_p5_MLT
На моем получающем конце я ожидаю получить int8, который я затем типизирую как uint8. Таким образом, для каждого полученного байта я бы ожидал 0-255 в качестве значения.
Я заметил некоторые несоответствия, когда я получал много 127-х на моем приемном конце, и обнаружил, выполняя некоторую базовую отладку, что для каждого значения, которое я посылаю от 128 до 255, мой код приема (сразу после получения вызова pnet) отображает 127.
Таким образом, я полагаю, что в файле pnet.c может что-то глючить, что приводит к усечению значений до 7-битного максимального значения вместо отображения полного uint8
спектр.
Есть идеи, почему это может происходить? Я в основном пользователь Matlab и не трачу много времени на типизацию данных, поэтому чувствую себя немного не в своей тарелке.
Получите код, который возвращает плохой / забавный символ ошибки:
data = pnet('read',number of bytes to read,'noblock')
1 ответ
Я понял, что здесь происходит. Оказывается, что если вы получаете значения, превышающие 127, в MATLAB с использованием UDP-сокетов (реализация Java/MATLAB UDP принудительно преобразует int8) и не указываете тип данных, которые вы ожидаете получить, MATLAB примет некоторый не дескриптор символ ошибки. Если вы в дальнейшем попытаетесь типизировать этот символ ошибки, он получит максимальное возможное значение для этого типа.
В моем случае из-за того, что я правильно возвращал некоторые данные, я не осознавал, что неправильно указывал MATLAB на получение от uint8. Таким образом, он получал правильно для 0-127, но дает мне символ ошибки для 128-255. Затем я попытался типизировать этот символ ошибки в несколько типов и обнаружил, что для каждого приведения он отображался как максимальное значение для этого конкретного типа.
Для исправления потребовалось только добавить опцию 'uint8' в мой вызов приема сокетов.
Фиксированный код:
data = pnet('read',number of bytes,'uint8','noblock')