#include <winsock.h>
#pragma comment(lib, "Ws2_32.lib")
//将一个8位数高低4位交换
static unsigned char bswap_8(unsigned char v)
{
return ((v & 0xff) << 4) | (v >> 4); //将参数(v & 0xff) << 4 相当于放到高位, v >> 4 位相当于放在低位
}
//将一个16位数高低8位交换
static unsigned short bswap_16(unsigned short v)
{
return ((v & 0xff) << 8) | (v >> 8);
}
//将一个32位数高低16位交换
static unsigned int bswap_32(unsigned int v)
{
return ((v & 0xff) << 24) | ((v & 0xff00) << 8) |
((v & 0xff0000) >> 8) | (v >> 24);
}
enum DataByteOrder
{
ABCD,
DCBA,
BADC,
CDAB
};
float get_float_databyteorder(const uint16_t *src, DataByteOrder order)
{
float f = 0;
uint32_t i;
switch (order)
{
case ABCD:
i = ntohl(((uint32_t)src[0] << 16) + src[1]);
memcpy(&f, &i, sizeof(float));
break;
case DCBA:
i = ntohl(bswap_32((((uint32_t)src[0]) << 16) + src[1]));
memcpy(&f, &i, sizeof(float));
break;
case BADC:
i = ntohl((uint32_t)(bswap_16(src[0]) << 16) + bswap_16(src[1]));
memcpy(&f, &i, sizeof(float));
break;
case CDAB:
i = ntohl((((uint32_t)src[1]) << 16) + src[0]);
memcpy(&f, &i, sizeof(float));
break;
default:
break;
}
return f;
}
void set_float_databyteorder(float f, DataByteOrder order, uint16_t *dest)
{
uint32_t i;
switch (order)
{
case ABCD:
memcpy(&i, &f, sizeof(uint32_t));
i = htonl(i);
dest[0] = (uint16_t)(i >> 16);
dest[1] = (uint16_t)i;
break;
case DCBA:
memcpy(&i, &f, sizeof(uint32_t));
i = bswap_32(htonl(i));
dest[0] = (uint16_t)(i >> 16);
dest[1] = (uint16_t)i;
break;
case BADC:
memcpy(&i, &f, sizeof(uint32_t));
i = htonl(i);
dest[0] = (uint16_t)bswap_16(i >> 16);
dest[1] = (uint16_t)bswap_16(i & 0xFFFF);
break;
case CDAB:
memcpy(&i, &f, sizeof(uint32_t));
i = htonl(i);
dest[0] = (uint16_t)i;
dest[1] = (uint16_t)(i >> 16);
break;
default:
break;
}
}
int main(int argc, char *argv[])
{
float f1 = 12.34;
uint16_t dst[2];
set_float_databyteorder(f1, ABCD, dst);
float f2 = get_float_databyteorder(dst, ABCD);
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)