【实验向】问题:假设计算机A和计算机B通信,计算机A给计算机B发送一串16个字节的二进制字节串,以数组形式表示:

简介: 【实验向】问题:假设计算机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群中的大佬,给了以上代码

简单分析一下上面的代码

4ac19c36192b91a2b6c61b0b03650cfd_f44513bb1d6ef9fdb701bd90746e054c.png

联合体和结构体套用, 读取float 就自动读取4字节数据,接下来就是对字节的交换操作了,由于是大端存储(字节逆序:将最低有效字节放在大地址单元中),数据逆置。

swap(unsigned char data[4]),简单容易理解,就不过多叙述了。

逆序后

269144160d14035f317aa29b1f17bf40_b99f3289c80bad3a892a0dd63cdd72a5.png

OK了!


细节


55c3f029e8efe011f2afe99592b16714_f96f125e5ff90c7b0d77750373747b6e.png

a6bde3c97400615b7f8cd68c158034d2_7a825ffa8b35bba8edda6bc0f0b6a0ec.png

d3993f375fc7ea5832df08feb056f5d8_72f24101f3d2b22ad1050e55eee3909c.png

a354fc65edbf85321630c98652d90a96_fe3061bf6b54854778c4cc5976d899a9.png

2c8c8e39f40c6970adfaa03f28784376_36cd9940250f9b86d3a798b178baffaa.png

6cb3bef8a3b91e8bf790f70ea6f5defe_b44cedaab3de3317a3bb167e8ed9cdbc.png

d35e0c113d0b9a9f3d82ce1b0dde9f2e_0a4a455abbb3a804fa5947039bd8f0e9.png

0389e70c541e48592fc6d4d8af8e75f2_886fe017fc947a110a45b1f55012e834.png

3a9536c96acd61df3255120242ee701d_1fdb69ca8b22488a8c0ac6629ccede75.png

1843018a0e2d5810750c921773815246_d1d68f466905470236c195b24554e3ed.png

ps:对话来自qq群一个好友回答 只是个人见解 如有错误可请谅解


相关文章
【计算机网络】第三章 数据链路层(可靠传输)
【计算机网络】第三章 数据链路层(可靠传输)
|
存储 缓存 算法
【计算机网络】数据链路层
【计算机网络】数据链路层
1621 0
【计算机网络】数据链路层
|
SQL HIVE
Hive分区+根据分区查询
Hive分区+根据分区查询
|
负载均衡 网络协议 Unix
Nginx七层(应用层)反向代理:SCGI代理scgi_pass篇
Nginx七层(应用层)反向代理:SCGI代理scgi_pass篇
265 1
|
存储 缓存 算法
【软考:软件设计师】 3 计算机组成与体系结构(二)详解存储系统 | 输入输出与总线
【软考:软件设计师】 3 计算机组成与体系结构(二)详解存储系统 | 输入输出与总线
1225 0
|
算法 安全
死锁相关知识点以及银行家算法(解题详细步骤)
死锁相关知识点以及银行家算法(解题详细步骤)
695 2
|
缓存
计算机网络——数据链路层-可靠传输的实现机制:选择重传协议SR(介绍、工作原理、窗口尺寸、题目练习)
计算机网络——数据链路层-可靠传输的实现机制:选择重传协议SR(介绍、工作原理、窗口尺寸、题目练习)
1452 1
|
存储 缓存 C语言
内存与CPU:计算机默契交互的关键解析
内存与CPU之间的密切互动是计算机运行的关键。从RAM到Cache,内存的物理结构和读写过程都影响着计算机的性能。指针在内存中的作用至关重要,就像楼房模型和数组一样,帮助我们理解内存的工作原理。了解内存的重要性,是深入了解计算机运行的第一步。
479 1
内存与CPU:计算机默契交互的关键解析
|
存储 Kubernetes 调度
深度解析Kubernetes中的Pod生命周期管理
深度解析Kubernetes中的Pod生命周期管理
|
机器学习/深度学习 人工智能 安全
智能时代的隐私守护者:AI加密技术的崛起与挑战###
本文深入探讨了人工智能(AI)在数据加密领域的创新应用,分析了AI如何增强数据安全性,同时也指出了面临的挑战和未来发展趋势。通过具体案例分析,展现了AI加密技术在保护个人隐私与促进数据安全方面的潜力,为读者提供对未来智能时代隐私保护的深刻洞见。 ###