【实验向】问题:假设计算机A和计算机B通信,计算机A给计算机B发送一串16个字节的二进制字节串,以数组形式表示:
问题:
假设计算机A和计算机B通信,计算机A给计算机B发送一串16个字节的二进制字节串,以数组形式表示:
unsigned char[16] = {0x3f, 0xa0, 0x00, 0x00, 0xbf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0xff, 0xff, 0xff, 0x9c};
其中:
0~3:4个字节为float f1,大端表示,IEEE754格式
4~7:4个字节为float f2,大端表示,IEEE754格式
8~11:4个字节为int i3,大端表示
12~15:4个字节为int i4,大端表示
要求:
- (1)编写一个C语言代码,求出f1、f2、i3、i4的值;
- (2)贴出源代码,以及打印结果。
#include <stdio.h>
void swap(unsigned char data[4]) {
unsigned char t = data[0];
data[0] = data[3];
data[3] = t;
t = data[1];
data[1] = data[2];
data[2] = t;
}
int main() {
union {
unsigned char bytes[16];
struct {
union {
float f1;
unsigned char f1_data[4];
};
union {
float f2;
unsigned char f2_data[4];
};
union {
int i3;
unsigned char i3_data[4];
};
union {
int i4;
unsigned char i4_data[4];
};
};
} data = {
.bytes = { 0x3f, 0xa0, 0x00, 0x00, 0xbf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0xff, 0xff, 0xff, 0x9c }
};
swap(data.f1_data);
swap(data.f2_data);
swap(data.i3_data);
swap(data.i4_data);
printf("%f %f %d %d\n", data.f1, data.f2, data.i3, data.i4);
return 0;
}
如果想检查类型,那就
void swap(_)
unsigned char _[4];
{
unsigned char t = _[0];
_[0] = _[3];
_[3] = t;
t = _[1];
_[1] = _[2];
_[2] = t;
}
int main() {
union {
unsigned char bytes[16];
struct {
float f1;
float f2;
int i3;
int i4;
};
} data = {
.bytes = { 0x3f, 0xa0, 0x00, 0x00, 0xbf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0xff, 0xff, 0xff, 0x9c }
};
swap(&data.f1);
swap(&data.f2);
swap(&data.i3);
swap(&data.i4);
printf("%f %f %d %d\n", data.f1, data.f2, data.i3, data.i4);
return 0;
}
思路历程:
首先想到的是利用指针从第三字节读到第零字节,存储到float类型变量中,然后打印。逐下同理。由于存储数据的类型是char[] 最小单位是1字节,利用地址(也就是指针)对字节进行操作(对字节进行操作是正确的),随之,确定了操作的基本单位—————字节
那么,指针的数据类型就确定了 unsigned char*;
随后,就没有随后了 代码打不出来 问了下qq群中的大佬,给了以上代码
简单分析一下上面的代码

联合体和结构体套用, 读取float 就自动读取4字节数据,接下来就是对字节的交换操作了,由于是大端存储(字节逆序:将最低有效字节放在大地址单元中),数据逆置。
swap(unsigned char data[4]),简单容易理解,就不过多叙述了。
逆序后

OK了!
细节










【实验向】问题:假设计算机A和计算机B通信,计算机A给计算机B发送一串16个字节的二进制字节串,以数组形式表示:的更多相关文章
- “此文件来自其他计算机,可能被阻止以帮助保护该计算机” 教你win7解除阻止程序运行怎么操作
win7 批量解除可执行文件的锁定 "此文件来自其他计算机,可能被阻止以帮助保护该计算机" http://blog.csdn.net/gscsnm/article/details/ ...
- 【iCore4 双核心板_FPGA】实验二十:NIOS II之UART串口通信实验
实验指导书及源代码下载地址: 链接:https://pan.baidu.com/s/1g_tWYYJxh4EgiGvlfkVu1Q 提取码:dwwa 复制这段内容后打开百度网盘手机App,操作更方便哦 ...
- Nodejs Buffer
javascript中的字符串本身就是以字符来存储,而非字节,下面的例子可以说明: console.log("0123456789".length); console.log(&q ...
- Python笔记001-Python入门
第一章:Python入门 1.Python介绍 1.1 简介 Python是一种解释型,面向对象的语言.由吉多·范罗苏姆(Guido van Rossum)于1989年发明,1991年正式公布.官网: ...
- Netty 中的粘包和拆包
Netty 底层是基于 TCP 协议来处理网络数据传输.我们知道 TCP 协议是面向字节流的协议,数据像流水一样在网络中传输那何来 "包" 的概念呢? TCP是四层协议不负责数据逻 ...
- 【JAVA今法修真】 第八章 仙道万维网 圣地元宇宙
您好,我是南橘,万法仙门的掌门,刚刚从九州世界穿越到地球,因为时空乱流的影响导致我的法力全失,现在不得不通过这个平台向广大修真天才们借去力量.你们的每一个点赞,每一个关注都是让我回到九州世界的助力,兄 ...
- Windbg调试命令详解
作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd. ...
- Brief描述子
一.Brief算法 1.基本原理 BRIEF是2010年的一篇名为<BRIEF:Binary Robust Independent Elementary Features>的文章中提出,B ...
- 你不知道的JavaScript--Item26 异步的脚本加载
先来看这行代码: <script src = "allMyClientSideCode.js"></script> 这有点儿--不怎么样."这该放 ...
随机推荐
- Blazor 组件库开发指南
翻译自 Waqas Anwar 2021年5月21日的文章 <A Developer's Guide To Blazor Component Libraries> [1] Blazor 的 ...
- RabbitMQ之消息模式2
消费端限流 什么是消费端的限流? 假设一个场景,首先,我们RabbitMQ服务器有上万条未处理的消息,我们随便打开一个消费者客户端,会出现下面情况: 巨量的消息瞬间全部推送过来,但是我们单个客户端无法 ...
- [考试总结]noip模拟40
最近真的是爆炸啊... 到现在还是有不少没改出来.... 所以先写一下 \(T1\) 的题解.... 送花 我们移动右端点,之后我们用线段树维护全局最大值. 之后还要记录上次的位置和上上次的位置. 之 ...
- Intel® QAT 加速卡之数据面流程(图)
QAT数据面流程 sessionSetupData数据结构 pOpData数据结构
- Sentry Web 性能监控 - Trends
系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...
- Maven专题1——坐标与依赖
1. 坐标 坐标用来唯一定位一个Maven构件: GAV(必需):groupId, artifactId, version packaging(可选): 可取值如:jar(缺省), war, pom, ...
- 使用 elementUI 的表单进行查询,表单中只有一个文本框时,回车会自动触发表单的提交事件,导致页面的刷新。
使用elementUI的el-form组件进行查询时,当输入框仅有一项时,回车自动提交表单,浏览器会刷新页面: 原因:由于当表单只有一个文本框时,按下回车将会触发表单的提交事件, 从而导致页面刷新. ...
- 使用 mysql 的 Docker 镜像
使用 mysql 的 Docker 镜像 前言 之前搞了很多都是手工在操作系统的镜像中安装使用 mysql,作为自己折腾也就算了,作为实际使用实为不妥:Docker最重要的特性就是可扩展性,把各种程序 ...
- PTA面向对象程序设计6-3 面积计算器(函数重载)
实现一个面积计算器,它能够计算矩形或长方体的面积. 函数接口定义: int area(int x, int y); int area(int x, int y, int z); 第一个函数计算长方形的 ...
- Django学习day03随堂笔记
每日测验 """ 今日考题 1.什么是静态文件,django静态文件配置如何配置,如何解决接口前缀不断变化,html页面上路径的引用需要反复修改的问题 2.request ...