Хочу разбить float на 4 байта - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Разбираясь с winsock2 понадобилось передавать по сети разные типы данных, а т.к. стандартные функции передачи и посылки сообщений по TCP и UDP протоколу используют только чаровские массивы, то надо всё разбивать на байты. Собственно вот попытка разбить FLOAT на 4 байта, но получается что-то не то... Идея с использованием указателя на INT нагуглена и вроде бы должна быть правильной... Собственно код:
char sendbuf[200]; 
    char recvbuf[200] = "";
    float forSending[6]; 
    for (int i = 0; i<6; i++) forSending[i] = 1.111 * i + 1.111;
    printf("For sending:\n");
    for (int i = 0; i<6; i++) printf("%f\n",forSending[i]);
    //float to char convertation:
    printf("Float to char:\n");
    for (int i = 0; i<6; i++)
    {
        int* tempPtr = (int*) (&forSending[i]);
        printf("%f\n", *tempPtr);
        for (int k = 0 ; k<4; k++)
        sendbuf[i*4+k] = (*tempPtr >> 8*(3-k)) &  255;  
    }
Результат в приложении

Решение задачи: «Хочу разбить float на 4 байта»

textual
Листинг программы
recv( socket, (char *)&f_val, sizeof( f_val ), 0 );

Объяснение кода листинга программы

В данном коде происходит следующее:

  1. Принимается сетевой пакет с помощью функции recv()
  2. В параметрах функции recv() указывается:
    • сокет, через который происходит прием пакета
    • буфер, в который будет записан пришедший пакет (в данном случае, это (char *)&f_val)
    • размер буфера в байтах (в данном случае, это sizeof( f_val ))
    • параметр, указывающий, что сетевой пакет нужно принять полностью (в данном случае, это 0) В результате выполнения данного кода, в буфер (в данном случае, это (char *)&f_val) будет записан пришедший сетевой пакет. Размер пакета будет равен 4 байтам (так как тип данных f_val - float, и он занимает 4 байта памяти).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5