C#和Java的大端位和小端位的问题

这篇具有很好参考价值的文章主要介绍了C#和Java的大端位和小端位的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C#代码里就是小端序,Java代码里就是大端序,
大端位:big endian,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,也叫高尾端
小端位:little endian,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,也叫低尾端
这个最早是指一个鸡蛋的大头和小头,分别被称为大端和小端,出自格列佛游记,两个国家因为吃鸡蛋从大头开始还是小头开始发生了战争。这是翻译的问题,大小端位是直译,高低尾端是意译,显然意译的更好理解一点。
具体是什么意思呢,看一个具体的例子,假如"11223344"存储在内存中,
C#和Java的大端位和小端位的问题,java相关,c#,java,大端位,小端位,高尾端,低尾端
地址有顺序,高尾端,就是按照地址的顺序,尾端的位置放高字节的数据,低尾端就是地址的尾端放低字节的数据。就是两种存储方式,各有利弊,具体我就不赘述了,主要是在用的时候,需要注意,
C#和Java的大端位和小端位的问题,java相关,c#,java,大端位,小端位,高尾端,低尾端

我在C#代码里使用

BitConverter.ToInt64(buff, index);
BitConverter.ToInt16(bufftemp, 0);
BitConverter.ToDouble(buff, index);
BitConverter.ToSingle(rSRPBytes, 0);

来解析数据,然后换到Java里就不行,最后检查一下,才发现,C#使用的是小端序,Java使用的是大端序,然后手动调整了一下,就成功了,分享几个我写的工具方法,供大家参考:文章来源地址https://www.toymoban.com/news/detail-654167.html

public double arr2Double(long[] arr,int index){
    long[] subArr = new long[8];
    System.arraycopy(arr, index, subArr, 0, 8);
    String binaryString = "";
    for(int i = 7;i > -1;i--){
        String binary = Long.toBinaryString(subArr[i]);
        while(binary.length() < 8){
            binary = "0" + binary;
        }
        binaryString = binaryString + binary;
    }
    long bits = Long.parseUnsignedLong(binaryString, 2);
    double result = Double.longBitsToDouble(bits);
    return result;
}

public long arr2Long(long[] arr,int index){
    long[] subArr = new long[8];
    System.arraycopy(arr, index, subArr, 0, 8);
    String binaryString = "";
    for(int i = 7;i > -1;i--){
        String binary = Long.toBinaryString(subArr[i]);
        while(binary.length() < 8){
            binary = "0" + binary;
        }
        binaryString = binaryString + binary;
    }
    long result = Long.parseUnsignedLong(binaryString, 2);
    return result;
}

public short arr2Short(long[] arr,int index){
    long[] subArr = new long[2];
    System.arraycopy(arr, index, subArr, 0, 2);
    String binaryString = "";
    for(int i = 1;i > -1;i--){
        String binary = Long.toBinaryString(subArr[i]);
        while(binary.length() < 8){
            binary = "0" + binary;
        }
        binaryString = binaryString + binary;
    }
    short result = Short.parseShort(binaryString, 2);
    return result;
}

public int arr2Int(long[] arr,int index){
    long[] subArr = new long[4];
    System.arraycopy(arr, index, subArr, 0, 4);
    String binaryString = "";
    for(int i = 3;i > -1;i--){
        String binary = Long.toBinaryString(subArr[i]);
        while(binary.length() < 8){
            binary = "0" + binary;
        }
        binaryString = binaryString + binary;
    }
    int result = Integer.parseUnsignedInt(binaryString, 2);
    return result;
}

public float arr2Float(long[] arr,int index){
    long[] subArr = new long[4];
    System.arraycopy(arr, index, subArr, 0, 4);
    String binaryString = "";
    for(int i = 3;i > -1;i--){
        String binary = Long.toBinaryString(subArr[i]);
        while(binary.length() < 8){
            binary = "0" + binary;
        }
        binaryString = binaryString + binary;
    }
    int bits = Integer.parseUnsignedInt(binaryString, 2);
    float result = Float.intBitsToFloat(bits);
    return result;
}

到了这里,关于C#和Java的大端位和小端位的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机系统中的大端模式和小端模式

    最近工作中有用到一个知识点,就是大小端,当然这是一个小的知识点,为什么写一个博文呢,我其实是想测试一下chatGPT,所以我开始将自己的想法告诉这个chatbot,让他给我一些写博文的建议,并且给我解答了一些疑惑,今天将自己的学习笔记整理出来展示给大家(by the

    2024年02月03日
    浏览(27)
  • 大端小端及其转换

    计算机在存储数据的时候,是以字节(byte)为基本单位来存储的,因此存储单字节类型的数据(比如char)不存在字节序的问题。但存储多字节的数据的时候(比方说4字节的int变量),就涉及到了以一个什么样的顺序来存储。下面举例来说明大端和小端的存储方式。 定义变量

    2023年04月25日
    浏览(24)
  • 大端存储与小端存储

    上次整型在内存中的存储忘说了一个:   根据数据类型不同,所占的字节数也不同。   所占字节多了,数据在内存中的存储顺序的问题也就出现了。   数据在内存中的存储顺序分两种:   大端[字节序]存储: 把一个数据的高位字节序(字节中存储的数据的位数更高的,可类

    2024年01月20日
    浏览(30)
  • keil_arm 大端小端 寄存器 栈

    @栈result   

    2024年02月11日
    浏览(28)
  • 一文读懂大端、小端、字节序、MSB、LSB、MSBs、LSBs

    5分钟完全理解上述嵌入式、物联网开发中很扯蛋的几个被玩坏概念。 对于涉及 bit 流的概念中 MSB(Most Significant Bit):最高有效位,二进制中代表最高值的比特位,这一位对数值的影响最大。 LSB(Least Significant Bit):最低有效位,二进制中代表最低值的比特位。 以字面值数

    2024年02月15日
    浏览(63)
  • 【100个 Unity实用技能】 | C# 中关于补位的写法 PadLeft,PadRight 函数

    老规矩,先介绍一下 Unity 的科普小知识: Unity 是 实时3D互动内容创作和运营平台 。 包括 游戏开发 、 美术 、 建筑 、 汽车设计 、 影视 在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和

    2023年04月14日
    浏览(39)
  • 问题记录:MFC使用ADO在32位和64位下分别连接ACCESS数据库碰到的问题

    题外话:近期收到个任务,给合作的公司弄一个静态库,库的功能需要加载文件夹中的ACCESS数据库,合作方希望同时有32位的 和 64位的。 进入正题把,首先声明,我的ACCESS数据库文件后缀是.mdb的 在x86下导入msado15.dll,我是这样写的 我按网上说的#import \\\"C:Program FilesCommon Fil

    2024年02月03日
    浏览(37)
  • 【OPENGL问题】Visual Studio添加第三方库——以32位和64位glut库为例

    这里简单记录 如何在Visual Studio添加第三方库——以32位和64位glut库为例 参考了KingRumn的博文:https://blog.csdn.net/KnownAll/article/details/17758847 GLUT(英文全写:OpenGL Utility Toolkit)是一个处理OpenGL程式的工具库,负责处理和底层操作系统的呼叫以及I/O。我在此之前也一直以为只有3

    2024年02月07日
    浏览(40)
  • 游戏在32位的iPhone手机下面没有问题,在64位的手机,如iPhone6下面,运行出现错误

    用lua开发了游戏,用下面的脚本加密成luac文件 cocos luacompile -s src/ -d out/ -e -k MyKey -b 123456 游戏在32位的iPhone手机下面没有问题,在64位的手机,如iPhone6下面,运行出现错误,提示: “asserts/src/main.luac”, error: syntax error during pre-compilation. 原因: 那个luajit号称支持64位 只是支持明

    2024年02月16日
    浏览(27)
  • number类型超出16位的问题(前端、后端处理)

    目录 1、前端解决方案  1.1 甩链接 1.3 对返回的json字符串进行数据预处理代码如下         2、后端解决方案 2.1 toString、String、\\\'\\\' 、new String() 自己悟、就是要改的地方多。 2.2拦截器 (可能超出范围的数值 前后端都可以写)  2.3 @JSONField(serializeUsing= ToStringSerializer.class) 推荐

    2024年02月03日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包