【实验向】问题:假设计算机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> 这有点儿--不怎么样."这该放 ...
随机推荐
- 日常shell练习
2021-07-19 1.echo的使用 1.1 echo -n 表示不换行输出 # echo输出会自动换行,换行输出两个1 echo 1 echo 1 # 不换行输出,不换行输出两个1 echo - ...
- vue 引用 tcplayer 做直播( 俩个例子,都可以用。替换直播地址即可,后端推流,前端观看。 )
例子一比例子二更加容易被理解.另外 m3u8 也支持 webrtc 开头的直播地址. 补充JS 得下载到本地,自行引入: https://imgcache.qq.com/open/qcloud/liv ...
- Linux 学习路线
前言 这篇文章会一直更新...只是将个人的文章总结归纳到这,不代表最佳学习路线 没有链接的文章后续会补上...还没写的知识点未来用到也会补上...太卷了 常用基础命令 Linux常用命令 - cd命令 ...
- 第06课:GDB 常用命令详解(中)
本课的核心内容: info 和 thread 命令 next.step.util.finish.return 和 jump 命令 info 和 thread 命令 在前面使用 info break 命 ...
- MacOS安装和卸载Java
安装java 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 设 ...
- lua中的sleep实现
这篇文章主要介绍了Lua中实现sleep函数功能的4种方法,本文讲解了在一个死循环中设置一个跳出条件方法.调用系统的sleep函数法.Windows下ping命令法.socket库中select函数法 ...
- 10 个不为人知的Python冷知识
1. 省略号也是对象 ... 这是省略号,在Python中,一切皆对象.它也不例外. 在 Python 中,它叫做 Ellipsis . 在 Python 3 中你可以直接写-来得到这玩意. > ...
- 'Specifying a namespace in include() without providing an app_name '报错解决
需要在每个ap下面的url.py 加入一个指定app的名字 比如 user app 下的 url.py 文件加入: urlpatterns = []app_name = "user& ...
- Math.round真的是四舍五入吗?我不这么认为
public static long round(double a) 返回最接近参数的 long.结果将舍入为整数:加上 1/2,对结果调用 floor 并将所得结果强制转换为 long 类型.换句话 ...
- pypandoc库实现文档转换
写在前面: 对于python程序员来说,文件格式之间转换很常用,尤其是把我们爬虫爬到的内容转换成想要的文档格式时.这几天看到一个网站上有许多文章,个人很喜欢,直接复制太麻烦,为了将爬到的html文件以 ...