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++代码实现

cpp 复制代码
#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;
}

四、测评详情

相关推荐
mftang32 分钟前
Python 字符串拼接成字节详解
开发语言·python
jasligea1 小时前
构建个人智能助手
开发语言·python·自然语言处理
kokunka1 小时前
【源码+注释】纯C++小游戏开发之射击小球游戏
开发语言·c++·游戏
_不会dp不改名_1 小时前
leetcode_3010 将数组分成最小总代价的子数组 I
算法·leetcode·职场和发展
云栖梦泽2 小时前
易语言开发从入门到精通:补充篇·网络编程进阶+实用爬虫开发·API集成·代理IP配置·异步请求·防封禁优化
开发语言
java1234_小锋2 小时前
Java高频面试题:SpringBoot为什么要禁止循环依赖?
java·开发语言·面试
铅笔侠_小龙虾2 小时前
Flutter Demo
开发语言·javascript·flutter
2501_944525542 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 账户详情页面
android·java·开发语言·前端·javascript·flutter
福大大架构师每日一题2 小时前
ComfyUI v0.11.1正式发布:新增开发者专属节点支持、API节点强化、Python 3.14兼容性更新等全方位优化!
开发语言·python
wangdaoyin20102 小时前
若依vue2前后端分离集成flowable
开发语言·前端·javascript