@Zaher220
Software developer

Как сформировать набор байт для пересылки через сокет Windows?

Здравствуйте.
Работаю с прибором по протоколу SCPI. К сожалению он реализован в приборе не по стандарту и требует предварять каждое сообщение его длинной. В документации это не описано, так что пришлось до этого доходить с помощью сниффера.
Сниффер мне говорит что оригинальная программа от производителя прибора пересылает длину сообщения в таком формате
Send: Return Code: 0x00000000
00000000 00 00 00 06
Скопировано из программы SocketSniff. Т.е. в формате 8 байт.
Теперь вопрос как сформировать char arr[] так что бы в нем лежали эти 8 байт.
Я пробовал делать так
std::stringstream ss;
ss << std::hex << 0x0000000000000006;
printf("x=%s\n", ss.str().c_str());

Получилось
Send: Return Code: 0x00000000
6
Попробовал
char ss[4] = {0};
sprintf(ss,"%16X",6);
printf("ss=%s\n", ff);

Получилось
Получилось
Send: Return Code: 0x00000000
0000000000000006
Прибор на такие способы записи не реагировал.
Таким образом требуется следующая запись
Send: Return Code: 0x00000000
00000000 00 00 00 06
Пока у меня не получилось сформировать и отослать нужный набор байт.
  • Вопрос задан
  • 2554 просмотра
Решения вопроса 1
@xandox
std::uint64_t length = GetMessageLength(); // ну тут наверное разбирешся
length = host_to_bigendian(length); // смотри для своей платформы как перевести в big endian
const char* lengthBytes = static_cast<const char*>(&length); // в памяти все и так как нужно уже лежит 
send(socket, lengthBytes, sizeof(length));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@bambrman
у тебя, судя по всему, передается строка, т.е. не 8 байт а 20,
сформировать можно вот так например

char ss[20];
sprintf(ss,"00000000 00 00 00 %.2X",6);
printf("ss=%s\n", ss);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы