浮点型在UDP的传输 ,float转字节型

问题:网络通信中所有数据都是以字节的形式传输,所以在传送数字的时候需要将其化为字节形式
单精度浮点型是四个字节

UDP服务端


//服务器
#include< stdio.h >
#include< string.h >
#include< winsock.h >
#include< windows.h >
#include <iostream>
#pragma comment( lib, "ws2_32.lib" )

#define PORT 2046
#define BACKLOG 10
#define TRUE 1
#define MAXDATASIZE 1000
using namespace std;
float ByteToFloat(char* byteArray)
{
	return *((float*)byteArray);
}
void main(void)
{
	int iServerSock;
	// int iClientSock;

	int addr_len;
	int numbytes;

	char buf[MAXDATASIZE];

	struct sockaddr_in ServerAddr;
	struct sockaddr_in ClientAddr;

	WSADATA WSAData;
	if (WSAStartup(MAKEWORD(1, 1), &WSAData))
	{
		printf("initializationing error!\n");
		WSACleanup();
		exit(0);
	}

	iServerSock = socket(AF_INET, SOCK_DGRAM, 0);
	if (iServerSock == INVALID_SOCKET)
	{
		printf("创建套接字失败!\n");
		WSACleanup();
		exit(0);
	}


	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_port = htons(PORT);//监视的端口号
	ServerAddr.sin_addr.s_addr = INADDR_ANY;//本地IP
	memset(&(ServerAddr.sin_zero), 0, sizeof(ServerAddr.sin_zero));


	if (bind(iServerSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr)) == -1)
	{
		printf("bind调用失败!\n");
		WSACleanup();
		exit(0);
	}

	while (1) {
		addr_len = sizeof(struct sockaddr);
		numbytes = recvfrom(iServerSock, buf, MAXDATASIZE, 0, (struct sockaddr *) & ClientAddr, &addr_len);
		if (numbytes == -1)
		{
			printf("recvfrom调用失败!\n");
			WSACleanup();
			exit(0);
		}

		printf("got packet from %s\n", inet_ntoa(ClientAddr.sin_addr));
		printf("packet is %d bytes long\n", numbytes);
		buf[numbytes] = '\0';
		//float aa = *((float*)buf);
		float aa, bb = 0, cc = 0;
		char buf1[4], buf2[4];
		//bb = *((float*)buf);
		memcpy(&aa, &buf , 4);
		/*
		for (int i = 0; i < 4; i++)
		{
			buf1[i] = buf[4 + i];
			buf2[i] = buf[8 + i];
		}
		*/
		memcpy(buf1, buf + 4, 4);
		memcpy(buf2, buf + 8, 4);
		bb = ByteToFloat(buf1);
		cc = ByteToFloat(buf2);
		//memcpy(&bb, &buf1, 4);
		//memcpy(&cc, &buf2, 4);
		printf("packet contains \"aa = %f bb = %f  cc = %f   buf = %s\"\n", aa, bb, cc, buf);

	}
	closesocket(iServerSock);
	WSACleanup();


}

UDP客户端

#include< stdio.h >
#include< stdlib.h >
#include< windows.h >
#include< winsock.h >
#include< string.h >
#include <iostream>
#pragma comment( lib, "ws2_32.lib" )

#define PORT 2046
#define MAXDATASIZE 100
using namespace std;


void main(void)
{

	int iClientSock;
	struct sockaddr_in ServerAddr;

	int numbytes;
	

	WSADATA WSAData;
	if (WSAStartup(MAKEWORD(1, 1), &WSAData))
	{
		printf("initializationing error!\n");
		WSACleanup();
		exit(0);
	}

	if ((iClientSock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
	{
		printf("创建套接字失败!\n");
		WSACleanup();
		exit(0);
	}

	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_port = htons(PORT);
	ServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	memset(&(ServerAddr.sin_zero), 0, sizeof(ServerAddr.sin_zero));
	while (1) 
	{
		float buf;
		cin >> buf ;
		char farray[12], longitude[4], latitude[4], altitude[4];
		memcpy(farray, &buf, sizeof(buf));
		cin >> buf;
		memcpy(latitude, &buf, sizeof(buf));
		cin >> buf;
		memcpy(altitude, &buf, sizeof(buf));
		for (int i = 0; i < 4; i++)
		{
			farray[4 + i] = latitude[i];
			farray[8 + i] = altitude[i];
		}
		numbytes = sendto(iClientSock, farray, sizeof(farray), 0, (struct sockaddr *) & ServerAddr, sizeof(struct sockaddr));
	}
	if (numbytes == -1)
	{
		printf("sendto调用失败!\n");
		WSACleanup();
		exit(0);
	}

	printf("sent %d bytes to %s\n", numbytes, inet_ntoa(ServerAddr.sin_addr));
	closesocket(iClientSock);
	WSACleanup();
}


float转byte

char farray[4];
*(float*)farray = buf;//强制类型转换
or
memcpy(farray, &buf, sizeof(buf));//使用memcpy

byte转float

float aa;
aa = *((float*)buf)
or
memcpy(&aa, &buf, 4);

还有一种方法,使用共同体转换

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Acnidouwo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值