扫盲运动—字节序

1 大端、小端字节序

术语“大端”和“小端”表示多个字节值的哪一端(小端或大端)存储在该值的起始地址。

  • 大端:将高序字节存储在起始地址,这称为大端(big-endian)字节序
  • 小端:将低序字节存储在起始地址,这称为小端(little-endian)字节序

为什么要有大端、小端字节序,多麻烦!统一使用大端字节序,不是更方便吗?
计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。

在这里插入图片描述
来个实例,要不然实在记不住。
在这里插入图片描述

操作系统的字节序一般是和处理器架构有关系的,具体来说:

  • 小端序: x86、MOS Technology 6502、Z80、VAX、PDP-11等处理器;
  • 大端序: Motorola 6800、Motorola 68000、PowerPC 970、System/370、SPARC(除V9外)等处理器;
  • 另外 ARM、PowerPC(除PowerPC 970外)、DEC Alpha、SPARC V9、MIPS、PA-RISC及IA64的字节序是可配置的。

2 网络字节序、主机字节序

  • 主机字节序:不同的机器主机字节序不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。我们把某个给定系统所用的字节序称为主机字节序(host byte order)。比如x86系列CPU都是little-endian的字节序。
    正是由于这个原因不同体系结构的机器之间无法通信,所以要转换成一种约定的数序,也就是网络字节顺序。

  • 网络字节序:网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节序采用大端(big endian)排序方式。

3 网络字节序与主机字节序之间转换

3.1 C/C++

头文件<netinet/in.h>
转换函数:htons(), ntohs(), htons()htonl()htons和ntohs完成16位无符号数的相互转换,htonl和ntohl完成32位无符号数的相互转换。在使用little endian的系统中,这些函数会把字节序进行转换;
在使用big endian类型的系统中,这些函数会定义成空宏;

3.2 Java

首先声明,Java虚拟机(JVM)的规范并没有明确要求使用大端序或小端序来表示多字节数据类型。

然而,Java的DataInput和DataOutput接口确实规定了使用大端序(网络字节序)。具体原因我认为有如下几点:

  1. 一致性和跨平台兼容性
    Java的设计原则之一是“一次编写,到处运行”。为了确保这一点,Java选择了一个确定的字节序,即大端序,使得Java程序的数据读取和写入在所有平台上都具有一致性。

  2. 网络字节序
    在网络传输中,大端序通常被认为是网络字节序。因为Java最初是为网络应用设计的(想想Java的口号:“The network is the computer.”),所以选择网络字节序作为默认的字节序是合理的。

  3. 与大多数网络协议的兼容性
    许多早期的网络协议(例如IP、TCP、UDP)都使用大端序。由于Java希望与这些协议兼容,因此采用大端序作为默认设置也是有道理的。

  4. 直观性
    对于人类来说,大端序的表示方式更为直观。例如,数字 0x12345678 在大端序中的表示方式是 12 34 56 78,这与我们的阅读习惯相符。 作者:程序员_可乐 https://www.bilibili.com/read/cv25882429/ 出处:bilibili
    Java设置大小端

public class HelloEndian {public static void main(String[] args) {ByteBuffer b = ByteBuffer.wrap(new byte[4]);b.order(ByteOrder.BIG_ENDIAN);b.putInt(0x01020304);System.out.println("Big-Endian:    " + Arrays.toString(b.array()));b = ByteBuffer.wrap(new byte[4]);b.order(ByteOrder.LITTLE_ENDIAN);b.putInt(0x01020304);System.out.println("Little-Endian: " + Arrays.toString(b.array()));}}

在用C/C++写通信程序时,在发送数据前务必用htonl和htons去把整型和短整型的数据进行从主机字节序到网络字节序的转换,而接收数据后对于整型和短整型数据则必须调用ntohl和ntohs实现从网络字节序到主机字节序的转换。
如果通信的一方是JAVA程序、一方是C/C++程序时,则需要在C/C++一侧使用以上几个方法进行字节序的转换,而JAVA一侧,则不需要做任何处理,因为JAVA字节序与网络字节序都是BIG-ENDIAN,只要C/C++一侧能正确进行转换即可(发送前从主机序到网络序,接收时反变换)。如果通信的双方都是JAVA,则根本不用考虑字节序的问题了。

转载链接

Java 的字节序讨论

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

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

相关文章

GC6609,GC6610超静音的两相步进电机驱动芯片的性能分析

两相步进电机驱动芯片GC6609&#xff0c;GC6610它们是一款超静音的两相步进电机驱动芯片&#xff0c;内置最大 256 细分的步进驱动模式&#xff0c; 超静音&#xff0c;低振动。芯片可以工作在 4~36V 的宽工作电压范围内&#xff0c;平均工作电流可以达到 2A和2.5A &#xff0c…

08 计算相机运动

文章目录 08 计算相机运动8.1 提取特征点8.2 对极几何8.2.1 几个矩阵8.2.2 相机坐标系与归一化坐标系8.2.3 三角测量 8.3 PnP: 3D-2D8.4 ICP&#xff1a;3D-3D8.5 总结 08 计算相机运动 8.1 提取特征点 读取图像 --> 提取角点 --> 计算各角点的描述子 --> 匹配描述子…

RHEL防火墙配置

目录 1.了解firewalld 2.firewalld的基本配置 3.配置firewalld的规则 4.icmp-blocks 5.Services 6.ports 1.了解firewalld 在RHEL8中用的防火墙是firewalld&#xff0c;在 firewalld中又涉及zone的概念。首先来了解一下什么是zone 如在进地铁或高铁时需要安检&#xf…

JavaEE07 定时器的使用和模拟实现

前言 前面我们聊了很多关于阻塞队列,单例模式等的应用,今天我们就来聊聊定时器的功能和模拟实现,其实定时器的实现在我们的日常生活中也很常见,比如说平常创建一些定时任务,定时开关机,定时去发表一篇qq空间等等,今天我们就来简单实现一个定时器. 1.JVM提供的定时器的使用 在自…

现代雷达车载应用——第2章 汽车雷达系统原理 2.3节

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.3 信号模型 雷达的发射机通常发出精心设计和定义明确的信号。然而&#xff0c;接收到的返回信号是多个分量的叠加&#xff0c;包括目标的反射、杂波…

usr/bin/env: ‘bash\r‘: No such file or directory

执行docker报错 这种错误是由于windows下执行linux的shell文件&#xff0c;格式不对导致 去ubuntu下安装dos2unix sudo apt-get install dos2unix 切换到对应的目录下&#xff0c;对shell文件进行格式化 dos2unix xxx.sh

数字化转型对企业有什么好处?

引言 数字化转型已经成为当今商业领域中的一股强大力量&#xff0c;它不仅仅是简单的技术更新&#xff0c;更是企业发展的重要战略转变。随着科技的迅猛发展和全球化竞争的加剧&#xff0c;企业们正在积极探索如何将数字化的力量融入到他们的运营和战略中。 数字化转型不仅是传…

9:00面试,9:05就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到12月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…

在linux上面使用shell脚本统计MYSQL数据情况

本公司涉及到一部分数据推送的业务&#xff0c;然后因为是配置数据传输任务的方式做的&#xff0c;但是有时候数据任务会出现问题&#xff0c;可能不推送等等情况&#xff0c;所以需要有个程序监控是否数据推送完成&#xff0c;简单就是检测规则就是定时跑源数据表和推送目标表…

抖音发布最新公告,清退所有全国本地生活服务商.

11月27日&#xff0c;抖音发布最新公告&#xff0c;一文公告让本地生活服务商行业鬼哭狼嚎&#xff0c;公告很明确&#xff0c;只保留了区域服务商&#xff0c;全国性的所有服务商被清退。 我们再来看看抖音本地生活的前世今生&#xff0c;最开始的时候抖音本地生活全部是自己部…

QT用户管理效果预览

用户管理效果 QT 用户管理 GITHUB网站 QT版本 CMakeList.txt find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Sql REQUIRED) target_link_libraries(tableView PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Sql)GitHub代码获取链接 GitHub代码获取链接

Java stream流toMap使用过程中空指针问题

Java8中stream操作list时常见的一个错误&#xff1a; 排查原因&#xff1a; 定位到代码中发现从数据查询是存在数据的 排查stream前对象为null的情况&#xff0c;那问题只能出现在toMap这里了 我们需要知道toMap是怎么帮我们封装数据的&#xff0c;先搞明白toMap的原理&#…

“error LNK1169: 找到一个或多个多重定义的符号”的解决方法

问题描述如下&#xff1a; 有 三个源文件&#xff0c;A.h、B.cpp、C.cpp。 A.h是头文件&#xff0c;其中声明了三个变量a1、a2、 a3。 B.cpp是A.h中所声明的类的实现源代码&#xff0c;C.cpp是主程序文件。B.cpp和C.cpp中均包含头文件 A.h。 在编译时&#xff0c;编译能够通…

用在半导体CST材料搬运AGV小车的RFID

RFID&#xff08;RadioFrequencyIdentification&#xff09;&#xff0c;又称无线射频识别技术&#xff0c;可通过射频信号进行非接触式的识别目标&#xff0c;近些年来被广泛应用在半导体制造业中&#xff0c;用于半导体行业的晶圆存储柜、电子货架、硅晶片清洗、半导体天车等…

YoloV8改进策略:双动态令牌混合器(D-Mixer)的TransXNet,实现YoloV8的有效涨点

摘要 双动态令牌混合器(D-Mixer),一种输入依赖的方式聚合全局信息和局部细节。D-Mixer通过分别在均匀分割的特征片段上应用有效的全局注意力模块和输入依赖的深度卷积,使网络具有强大的归纳偏差和扩大的有效感受野。使用D-Mixer作为基本构建块设计了TransXNet,这是一种新…

STM32——超声波传感器

需求&#xff1a; 使用超声波测距&#xff0c;当手离传感器距离小于 5cm 时&#xff0c; LED1 点亮&#xff0c;否则保持不亮状态 接线&#xff1a; 定时器配置&#xff1a; 使用 TIM2 &#xff0c;只用作计数功能&#xff0c;不用作定时。 将 PSC 配置为 71 &#xff0c;…

Java实现Leetcode题(栈和队列)

Leetcode232&#xff08;用栈实现队列&#xff09; package stack_queue;import java.util.Stack;public class Leetcode232 {public static void main(String[] args) {MyQueue myQueue new MyQueue();myQueue.push(1);myQueue.push(2);System.out.print(myQueue.peek());Sy…

基于K-means与CNN的遥感影像分类方法

基于K-means与CNN的遥感影像分类 一、引言 1.研究背景 航天遥感技术是一种通过卫星对地观测获取遥感图像信息数据的技术&#xff0c;这些图像数据在各领域都发挥着不可或缺的作用。遥感图像分类主要是根据地面物体电磁波辐射在遥感图像上的特征&#xff0c;判断识别地面物体的属…

推荐算法:HNSW【推荐出与用户搜索的类似的/用户感兴趣的商品】

HNSW算法概述 HNSW&#xff08;Hierarchical Navigable Small Word&#xff09;算法算是目前推荐领域里面常用的ANN&#xff08;Approximate Nearest Neighbor&#xff09;算法了。其目的就是在极大量的候选集当中如何快速地找到一个query最近邻的k个元素。 要找到一个query的…

uniapp微信小程序点击保存图片

一&#xff1a;需要用到的API 1.uni.uploadFile(OBJECT) 将本地资源上传到开发者服务器 uni.uploadFile(OBJECT) | uni-app官网 2. uni.saveImageToPhotosAlbum(OBJECT) 保存图片到系统相册。 uni.chooseImage(OBJECT) | uni-app官网 注意&#xff1a;微信小程序在2023年…