7-14 字节序(Endianness)---PTA实验C++

一、题目描述

“内存寻址的最小单位是字节”——明白。
“每个字节有唯一的编号,称为地址”——明白。
“C++中int通常为四个字节”——了解。
int x = 1;最低字节是1还是0?——纳尼?

事实上,这里有点小小分歧:

  • 多字节数据中(例如0x12345678):
    • 权重最大的字节称为:MSB,Most Significant Byte。(例中0x12所在字节)
    • 权重最小的字节称为:LSB,Least Significant Byte。(例中0x78所在字节)
  • 多字节数据中,从低地址往高地址依次存放:
    • LSB...MSB,称为小端序(LE, little-endian)
    • MSB...LSB,称为大端序(BE, big-endian)
    • 极少数CPU使用混合序(middle-endian, mixed-endian),例如0x12345678在内存中地址由低到高为34 12 78 56
    • 有些CPU对LE、BE都支持,可以切换,称为Bi-Endianness

扯远了,回来看几个例子,地址从左往右增大,那么:

|00 01 02 03 04 05 06 07|
+-----------------------+
|12 34 56 78 .. .. .. ..| BE, int32_t x = 0x12345678
|78 56 34 12 .. .. .. ..| LE, int32_t x = 0x12345678|01 00 00 00 00 00 00 00| LE: int64_t x = 1
|01 00 00 00 .. .. .. ..| LE: int32_t x = 1
|01 00 .. .. .. .. .. ..| LE: int16_t x = 1
|01 .. .. .. .. .. .. ..| LE: int8_t  x = 1|00 00 00 00 00 00 00 01| BE: int64_t x = 1
|00 00 00 01 .. .. .. ..| BE: int32_t x = 1
|00 01 .. .. .. .. .. ..| BE: int16_t x = 1
|01 .. .. .. .. .. .. ..| BE: int8_t  x = 1
  • BE便于阅读(人们写数字其实是BE风格)。网络协议多为BE,所以BE又称为网络字节序(network order)
  • LE便于类型转换。CPU多用LE模式。

任务:现在知道一些系统上变量的值、从其内存中导出的字节序列,请判断系统是否为小端序。
目的:建立字节序的概念;掌握检测字节序的方法。
提示:可用乘法、除法、位运算处理。如检测当前计算环境的字节序,可以用union提取字节序列。

输入规格
  • 由多组数据构成。每行一组,读取到EOF为止。
  • 每组由一个十进制数值开头,之后是某种计算环境保存该数值的int32变量由低到高导出的4个字节的十六进制数值。
输出规格
  • 判断该环境的字节序,小端序输出LE,如不符合小端序但符合大端序输出BE,否则输出UNKNOWN
样例输入
67305985 01 02 03 04
67305985 04 03 02 01
67305985 03 04 01 02
样例输出
LE
BE
UNKNOWN
样例解释
  • 第1组:小端序,输出LE。
  • 第2组:大端序,输出BE。
  • 第3组:既不是小端序、也不是大端序,输出UNKNOWN。这是个混合序的例子(mixed-endian)

二、实现思路

1、利用hex函数将输入的value值转为16进制,同时利用setw(8)<<setfill('0')将不够的位补0

2、利用stringstream流接收转为16进制的value串ss<<hex<<setw(8)<<setfill('0)<<value;

3、转为字符串数组两个两个存储

!!!测试样例中的67305985转为16进制就是04030201

三、完整C++代码实现

#include<iostream>
#include<cstdint>
#include<sstream>
#include <iomanip>
#include<string>using namespace std;
void Endian(uint32_t value,string s[4]) {stringstream ss;ss << hex << setw(8) << setfill('0') << value;string hex_str = ss.str();string f[4];for (int i = 0; i < 4; i++) {f[i] = f[i] + hex_str[2 * i] + hex_str[2 * i + 1];}if (f[0] == s[0] && f[1] == s[1] && f[2] == s[2] && f[3] == s[3]) {cout << "BE" << endl;} else if(f[0] == s[3] && f[1] == s[2] && f[2] == s[1] && f[3] == s[0]) {cout << "LE" << endl;}else{cout<<"UNKNOWN"<<endl;}}
int main(){uint32_t value;string str[4];while(cin>>value){cin>>str[0]>>str[1]>>str[2]>>str[3];Endian(value,str);}return 0;
}

四、测评详情

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/846423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript移除事件的方法

JavaScript移除事件的方法有两种&#xff0c;分别是removeEventListener和οnclicknull。 使用removeEventListener方法&#xff1a; removeEventListener方法用于从元素中移除之前添加的事件监听器。它需要传入三个参数&#xff1a;事件类型、事件处理函数和一个可选的布尔值…

IDEA 学习之 命令行太长问题

现象 Error running App Command line is too long. In order to reduce its length classpath file can be used. Would you like to enable classpath file mode for all run configurations of your project?解决办法 办法一 .idea\workspace.xml ——> <compone…

软件开发整体介绍

黑马程序员瑞吉外卖 文章目录 一、软件开发流程二、角色分工三、软件环境 一、软件开发流程 二、角色分工 三、软件环境

【探索微软 Edge:现代化的网页浏览体验】

探索微软 Edge&#xff1a;现代化的网页浏览体验 微软 Edge 是一款现代化的网页浏览器&#xff0c;它由微软开发并推出&#xff0c;旨在提供更快速、更安全、更现代化的网页浏览体验。Edge 浏览器基于 Chromium 开源项目&#xff0c;这使得它拥有与 Google Chrome 类似的性能和…

13.FreeRTOS使用事件标记组

FreeRTOS 事件标记组 什么是事件标记组&#xff1f; 事件标记组是一个24&#xff08;在 FreeRTOS 中&#xff0c;默认情况下&#xff0c;事件标记组的位数是 24 位&#xff09;位的变量&#xff0c;每一位&#xff08;bit&#xff09;可以独立地被设置或清除。任务可以等待一…

锁是实现原子性的一种方案,但是原子性的实现不一定需要通过锁机制保证

前言&#xff1a;在实际开发过程中&#xff0c;我们可能会通过事务来保证原子性&#xff0c;但是很多人存在误解&#xff0c;他们会以为Transactional 注解原子性就是代表java中的CAS或者锁那种也能保证并发情况下的原子性。其实不是这样的&#xff0c;MySQL的原子性是通过redo…

GraphQL(2):使用express和GraphQL编写helloworld

1 安装express、graphql以及express-graphql 在项目的目录下运行一下命令。 npm init -y npm install express graphql express-graphql -S 2 新建helloworld.js 代码如下&#xff1a; const express require(express); const {buildSchema} require(graphql); const grap…

vue3与ts的组合式API

vue3与ts的组合式API props 1.基本props <script setup lang"ts"> const props defineProps<{foo: stringbar?: number }>() </script>2.抽离props <script setup lang"ts"> interface Props {foo: stringbar?: number }co…

leetcode146.LRU缓存,从算法题引入,全面学习LRU和链表哈希表知识

leetcode146. LRU 缓存 题目链接 请你设计并实现一个满足 LRU (最近最少使用) 缓存约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关…

【QT】父子按钮同时响应点击事件

QPushButton如何响应点击事件 QPushButton::event(QEvent *e) 。可以看到在QPushButton中的event函数中并没有鼠标点击相关的操作&#xff0c;那么我们去QAbstractButton::event中寻找 damn it!。依然没有那我们去QWidget::event中寻找 damn it! 只有mousePressEvent mouseR…

leetcode165.比较版本号,简单模拟

leetcode165.比较版本号 给你两个 版本号字符串 version1 和 version2 &#xff0c;请你比较它们。版本号由被点 ‘.’ 分开的修订号组成。修订号的值 是它 转换为整数 并忽略前导零。 比较版本号时&#xff0c;请按 从左到右的顺序 依次比较它们的修订号。如果其中一个版本字…

主流摄像机:海康、大华、宇视、华为等RTSP格式

主流摄像机&#xff1a;海康、大华、宇视、华为等RTSP格式 解决方案速览海康摄像机大华摄像机宇视摄像机华为摄像机 解决方案速览 品牌rtsp格式rtsp举例海康rtsp://[username]:[password][ip]:[port]/[codec]/[channel]/[subtype]/av_streamrtsp://admin:admin123192.168.1.10…

libcef.dll丢失的解决方法-多种libcef.dll亲测有效解决方法分享

libcef.dll是Chromium Embedded Framework (CEF)的核心动态链接库&#xff0c;它为开发者提供了一个将Chromium浏览器嵌入到本地桌面应用程序中的解决方案。这个库使得开发者能够利用Chromium的强大功能&#xff0c;如HTML5、CSS3、JavaScript等&#xff0c;来创建跨平台的应用…

罕见!史诗级“大堵船”

新加坡港口的停泊延误时间已延长至7天&#xff0c;积压的集装箱数量达到惊人的450000标准箱&#xff0c;远超新冠疫情暴发时期的数轮高点。业内认为&#xff0c;近期东南亚恶劣的天气情况加剧了该区域港口拥堵。 5月31日&#xff0c;上海航运交易所&#xff08;下称“航交所”…

重生奇迹MU召唤师如何学习狂暴术?

一、了解狂暴术的基本信息 狂暴术是一种非常强大的技能&#xff0c;可以让召唤师的攻击力和防御力大幅度提高&#xff0c;但同时也会增加自身的伤害。在使用狂暴术之前&#xff0c;召唤师需要仔细考虑自己的状态和对手的情况。 二、学习狂暴术的方法 1.通过任务学习 在游戏…

Docker安装与使用 --学习笔记

一、概述 Docker是什么? Docker是一种工具&#xff0c;类似于一个虚拟箱子&#xff0c;可以把软件和它运行所需要的环境打包放进这个箱子里。这样&#xff0c;无论这个箱子放到哪里&#xff0c;软件都能像在原来的地方一样运行&#xff0c;不会因为换了地方就出问题。 假设…

uniapp使用数据持久化存储

什么是持久化存储 持久化存储是指将数据存储在非易失性介质中&#xff0c;以保证数据在系统重启或断电后仍能保持不变。这种存储方式确保数据持久存储并且可靠地被读取和访问&#xff0c; 简答来说&#xff1a;就是防止丢失&#xff0c;长期存储 为什么要用持久化存储 Pini…

leetcode5 最长回文子串

给你一个字符串 s&#xff0c;找到 s 中最长的 回文 子串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba" 同样是符合题意的答案。示例 2&#xff1a; 输入&#xff1a;s "cbbd" 输…

【Java】一文看懂Thread 线程池的 7 种创建方式、任务队列及自定义线程池(代码示例)

本文摘要&#xff1a;【Java】Thread 线程池的 7 种创建方式及自定义线程池&#xff08;代码示例版&#xff09; &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专…

编写一款2D CAD/CAM软件(十九)点选图形

点选图元原理 设定鼠标敏感范围,比如选中鼠标点击位置5个像素内距离最近的图元;当鼠标点击时,求解点击位置在几何坐标系下坐标点与附近几何图元的距离;如果到图元距离小于设定的鼠标敏感范围,则视为图形可选中;进一步,如果多个图元满足被选中的条件,则只选中距离最近的…