Програмлю в Builder C++ 6. Появилась необходимость добавление к запросу ещё 2 байта с контрольной суммой.
У меня есть буфер:
AnsiString buf = "\x11\xFC\x50";
И вот вопрос, как мне правильно подцепить эти два байта к переменной buf?
Пробовал и buf = buf + AnsiString("\x") + AnsiString(LoByte);
и buf.c_str() = buf.c_str() + Char("\x") + Char(LoByte.c_str());
всё равно при передаче данных в comport из buf, нормальные 3 байта 11FC50 и ещё \x27\xF6
Помогите кто чем может, а то уже даже незнаю куда копать.
26.11.06 22:55: Перенесено модератором из 'C/C++' — Павел Кузнецов
Здравствуйте, mrdemon, Вы писали:
M>LoByte имеет строку 27 (LoByte = "27"), а buf у меня содержит 3 байта (0x11 0xFC 0x50). Мне надо LoByte превести к виду 0x27 и добавить в buf
M>Помогите пожалуйста, а то уже 2 дня мучаюсь и не как немогу понять что и как делать
Зачем ты LoByte делаешь AnsiString, кто тебе мешает использовать тип char?
Какая сигнатура у CRC? Что это объект с оператором приведения типов или функция. Если объект — где описание, если функция — дай сигнатуру;
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
"В любое мгновение принятия решения, лучшее, что вы можете сделать, это принять правильное решение; следующим лучшим вариантом будет принять неправильное решение, худший вариант – не принимать решения совсем" (c) Теодор Рузвельт.
Здравствуйте, mrdemon, Вы писали:
M>Програмлю в Builder C++ 6. Появилась необходимость добавление к запросу ещё 2 байта с контрольной суммой. M>У меня есть буфер: M>AnsiString buf = "\x11\xFC\x50";
M>Отправляю буфер функции и получаю строки:
По-видимому, CRC возвратило строки "27" и "F6", т.е. шестнадцатеричные коды. Что за, не побоюсь этого слова, идиотский программный интерфейс? Почему нельзя было возвращать сразу одно 2-байтовое число? Или там какие-то подпольные преобразования типов к строкам, которые непонятны из приведённого тобой кода. Покажи объявление CRC.
M>И вот вопрос, как мне правильно подцепить эти два байта к переменной buf? M>Пробовал и buf = buf + AnsiString("\x") + AnsiString(LoByte);
Ты склеиваешь buf + "\x" + "27" + "\x" + "F6". Кстати, "\x" — некорректная запись: такого эскейпа нет (есть \xHH где HH — шестнадцатеричные цифры) и компилятор должен выругаться.
Результат — "\\x27\\xF6"
M>и buf.c_str() = buf.c_str() + Char("\x") + Char(LoByte.c_str());
А это вообще что-то левое: buf.c_str() возвращает указатель на символы, к указателю прибавляешь два числа (смещаешь его) и пытаешься присвоить результат значению-указателю.
M>всё равно при передаче данных в comport из buf, нормальные 3 байта 11FC50 и ещё \x27\xF6 M>Помогите кто чем может, а то уже даже незнаю куда копать.
Копать в сторону книг, где объясняются сишные строки. Почему склеивание "\\x" и "27" не даёт строку из одного символа с кодом 0x27.
И ещё копать в сторону определения CRC.
Здравствуйте, Кодт, Вы писали:
К>Что за, не побоюсь этого слова, идиотский программный интерфейс?
Согласен. Использовать Boost.CRC Library и не знать подобного рода проблем. Ну или в крайнем случае руками;
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
"В любое мгновение принятия решения, лучшее, что вы можете сделать, это принять правильное решение; следующим лучшим вариантом будет принять неправильное решение, худший вариант – не принимать решения совсем" (c) Теодор Рузвельт.