c# int 小端_c# 小端序 加载int - CSDN
  • private static bool _isBigEndian; private static bool _isEndianChecked = false; private static bool IsBigEndian() { if( !_isEndianChecked ) { _isEndianChecked = true;... int nCheck = 0x01aa
    	private static bool _isBigEndian;
    	private static bool _isEndianChecked = false;	
    	private static bool IsBigEndian()
    	{
    		if( !_isEndianChecked )
    		{
    			_isEndianChecked = true;
    			int nCheck = 0x01aa;
    			_isBigEndian = ( nCheck & 0xff ) == 0x01;
    		}		
    		return _isBigEndian;
    	}	
    	private static int SwitchEndianInt( int inNum )
    	{
    		int nRet = ( inNum & 0xff ) << 24  |
    			   ( inNum & 0xff00 ) << 8 |
             		   ( inNum >> 8 ) & 0xff00 |
    			   ( inNum >> 24 ) & 0xff;
    		return nRet;
    	}
    展开全文
  • C# 大端小端转换

    2019-09-02 11:40:19
    本文告诉大家如何在C#转换大端和小端。 这里有一个有趣的故事,请看详解大端模式和小端模式 - CSDN博客 默认的 C# 使用的是小端,如果收到的消息是大端,那么就会出现解析错误。 例如收到的数据是 byte ...

    关于大端和小端,是一个有趣的问题。本文告诉大家如何在C#转换大端和小端。

    这里有一个有趣的故事,请看详解大端模式和小端模式 - CSDN博客

    默认的 C# 使用的是小端,如果收到的消息是大端,那么就会出现解析错误。

    例如收到的数据是 byte 数组,现在知道数据是大端数据,需要把大端转小端,首先需要把数据复制出来。

    复制数组

    假设收到的数据是 data ,里面的前两个 byte 是不需要的,格式是

    也就是需要复制出第2个到第5个byte出来,转换这个数据反序。

    复制数组的方式有很多个,例如 Array.Copy 和 Buffer.BlockCopy 两个函数使用方式差不多

    下面我使用 Array.Copy 做例子

    首先定义一个数组用来反序

    var revertByteList = new byte[4];
    

    然后复制数据

    Array.Copy(data, 2, revertByteList, 0, 4);
    

    对数据反序,这样就转换大端

    revertByteList = revertByteList.Reverse().ToArray();
    

    数组转整数

    从数组转整数的方式很简单,使用下面代码就可以转换

    var n = BitConverter.ToInt32(revertByteList, 0);
    

    小端转大端就是先把 int 转 byte ,然后按照每 4 个 byte 反序就可以

    我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

    如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

    交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

    展开全文
  • C# 大端与小端

    2016-01-07 14:08:03
    c# 通信中字节序处理。 最近在写一个短信下发功能,客户端使用c#和java的短信网关的进行网络通信。 ...之前使用java进行开发,一切正常,改用c#无法收到...而c#在windows平台上是小端字节序。 网络发送字节流是按
    c# 通信中字节序处理。

    最近在写一个短信下发功能,客户端使用c#和java的短信网关的进行网络通信。

    之前使用java进行开发,一切正常,改用c#无法收到网关应答。

    想了半天意识到是不是网络字节序问题,

    java默认就是大端字节序,和网络字节序是一至的,所以不转换也不会有问题,

    而c#在windows平台上是小端字节序。

    网络发送字节流是按大端序发送,也就是从左到右发送,和c#的小端序相反,造成网关不能正常识别协议。

    尝试c#中转换一下字节序,通信成功。

    c#中字节序转换有两种方法。

    非字串使用 System.BitConverter.GetBytes()方法,先读入字节数组中,然后再用Array.Reverse()对byte数组反序一下,得到大端序字节数组。

    代码: 

     short x = 6;

    byte[] a=System.BitConverter.GetBytes(x);   //得到小端字节序数组

    Array.Reverse(a);   //反转数组转成大端。

     

     

    另外c#直接提供了网络字节序转换方法。

     System.Net.IPAddress.HostToNetworkOrder(本机到网络转换)

    System.Net.IPAddress.NetworkToHostOrder(网络字节转成本机)

    推荐使用这种方法,简单有效。

    代码示例:

     short x = 6;

    short b = System.Net.IPAddress.HostToNetworkOrder(x);        //把x转成相应的大端字节数

    byte[] bb = System.BitConverter.GetBytes(b);        //这样直接取到的就是大端字节序字节数组。

     

    对于字符串型:使用 System.Text.Encoding.Default.GetBytes();直接取字串对应字节数组。

    不知道为什么这个方法取到的直接就是大端字节数组。不用转换。

    后来查了一下,关于字串的字节序问题,因为gbk和utf-8都是以单个字节表示数字的,所以不存在字节序问题,在多个不同系统架构都用。对于utf-16,则是以双字节表示一个整数,所以为会有字节序问题,分大小端unicode。

    System.Text.Encoding.Default.GetBytes();在我的简体中文系统上是以gb2312的编码,也就是单个字来进行编码的,所以也不会有字节序问题。

    补充:“对于任何字符编码,编码单元的顺序是由编码方案指定的,与endian无关。例如GBK的编码单元是字节,用两个字节表示一个汉字。这两个字节的顺序是固定的,不受CPU字节序的影响。UTF-16的编码单元是word(双字节),word之间的顺序是编码方案指定的,word内部的字节排列才会受到endian的影响。”,所以utf-8也没有字节序的问题。字节序问题之存在于需要使用两个字节以上来表示整数。而UTF-8只是一串字节流,不存在字节序问题,不过将这些字节流翻译成Unicode比其他的传输方式复杂。以字节为单位编码的,无论一个汉字是多少个字节,都无字节序问题。
    你注意,字节序问题不是指多个字节传输的先后,这个是固定的无异议的。而是指一个多字节编码在机器中的表示方式问题。
    char str[] = "abaksdkakskasklasflk";这个无字节序问题。

    int    str[] = {0x11223344, 2, 3 }就有字节序问题了。因为str[0]同样数值不同机器中表示不同。

    而剩下的, 就是字符编码内部的字节序了。比如UTF-16是用两个字节表示一个字符,但是这两个字节内部如何排序,系统并不知道,所以必须指定字节序。但是UTF-8由于几个字节表示并不相同,一定要从那个表示长度的字节开始读,相当于一开始就知道该从哪里是队头队尾,所以不存在字节序问题。

    附上字节序说明:

     

    为什么要注意字节序的问题呢?你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?尤其是当你把你在微机上运算的结果运用到计算机群上去的话。在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而JAVA编写的程序则唯一采用big endian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果?就拿上面的 0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了JAVA程序,由于JAVA采取big endian方式存储数据,很自然的它会将你的数据翻译为0x78563412。什么?竟然变成另外一个数字了?是的,就是这种后果。因此,在你的C程序传给JAVA程序之前有必要进行字节序的转换工作。

     

     用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:

      Big Endian

      低地址 高地址

      ----------------------------------------->

      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      | 12 | 34 | 56 | 78 |

      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      Little Endian

      低地址 高地址

      ----------------------------------------->

      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      | 78 | 56 | 34 | 12 |

      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+



    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
     
    namespace ConsoleApplication2
    {
        class Program
        {
              static void Main(string[] args)
            {
                byte[] b = { 1, 2, 3, 4 };
                 
                //x1是小端模式值:x1=67305985=0x04030201
                int x1 = BitConverter.ToInt32(b, 0);
     
                //x2是大端模式值:x2=16909060=0x01020304
                int x2 = IPAddress.NetworkToHostOrder(x1);
            }
        }
    }

    上面代码利用IPAddress.NetworkToHostOrder( )方法实现大、小端转换。


    展开全文
  • 1.Window系统默认为小端数据格式 2.使用C# 语法,比如: byte[] ds = new byte[4]; ds = BitConverter.GetBytes(Ints[i]); 使用BitConverter.GetBytes()方法得到的是默认的小端格式。 切换的方法 ...

    1.Window系统默认为小端数据格式

    2.使用C# 语法,比如:

       

    byte[] ds = new byte[4];
    ds = BitConverter.GetBytes(Ints[i]);

    使用  BitConverter.GetBytes()方法得到的是默认的小端格式。

    切换的方法

    Array.Reverse(ds);

     

    转载于:https://www.cnblogs.com/jiangyan219/articles/9567480.html

    展开全文
  • 什么是大端和小端Big-Endian和Little-Endian的定义如下:1) Little-Endian就是低位字节排放在内存的低地址,高位字节排放在内存的高地址。2) Big-Endian就是高位字节排放在内存的低地址,低位字节排放在内存的...
  • c# int与byte[]转换

    2014-07-21 21:06:19
    网络上总结的方法汇总: ...1: public byte[] intToByte(int i) {  byte[] abyte0 = new byte[4];  abyte0[0] = (byte) (0xff & i);  abyte0[1] = (byte) ((0xff00 & i) >> 8);  aby
  • 最近赶的一个项目是一个C#写的地面站,里面用到了一个变量 isBigEndian ,因为是改别人的代码,而且没有对应的文档说明,注释也是一个悲剧(而且是半开源的,核心代码都打成了DLL,人生感觉都要打出GG了),所以刚...
  • int num = 255; byte b = Convert.ToByte(num); 注:Convert.ToByte()方法能够把许多数值类型、bool、char转成byte,甚至可以把任意进制的合法数字的字符串基于相应的进制转成byte【比如Convert.ToByte("3C&...
  • 今天在这里给大家做个int和byte类型转换的总结。直接附上代码。这年头就是要这么干脆。 /** * 以大端模式将int转成byte[] */ public static byte[] intToBytesBig(int value) { byte[] src = new byte[4...
  • using System; namespace Framework.NetPackage.Common { /// /// 字节序转换 /// public static class Endian { public static short SwapInt16(this short n) { re
  • c#字节序转换

    2016-10-26 19:50:21
    c#在windows平台上是小端字节序。  网络发送字节流是按大端序发送,也就是从左到右发送,和c#小端序相反,造成网关不能正常识别协议。  尝试c#中转换一下字节序,通信成功。  c#中字节序转换有两种方法。...
  • 在JAVA与C#通讯时, 由于开发语言的差异,发送与接收需要做转换才可以得到正确的值。 Javaint to byte public static byte[] ConvertIntToByteArray(int i)  {  byte[] arry = new byte[4]; ...
  • 大小转换

    2016-03-05 10:39:45
    文章以32位整数为输入,采用两种方法进行大小转换,一个是宏定义,一个是函数形式;#include "stdio.h" #define T(x) (((x&0xff))|((x&0xff00))|((x&0xff0000)>>8)|((x&0xff000000)>>24)) //1.四个字节的排放顺序...
  • 这里涉及双向转换问题和大小转换的问题。 (1)float、int等类型转bytes数组 使用:GetBytes。 可以将常见的各种数据类型转换为byte数组。 参见: BitConverter.GetBytes Method 例如: float fvalue = 1.02...
  • 通信过程中由于C#用的是小端序,Java使用的是大端序。C#在向服务器发送数据时,需要将字节数组的大端序》端绪。还有在发送到Java服务器字符串需要加上”\r”,接收时去掉"\r" 在C#可以使用2中方式转换: 1> #...
  • c#中 值类型 本身就是个类, int 型 默认初始化为0,除非你将一个 null 传 给 int 可能出现将int型试图赋值为null 的异常抛出 你所说的空是null的意思吗?int是值类型,不可能为null,只有引用类型才可能是...
  • 网络数据是大端模式,而c#中的数据小端结构,那么在读写网络数据的时候需要进行转换。c#类库IPAddress已经封装了大小的转换。 封装代码如下: using System.IO; using System.Net; using System; ...
  • C#服务端与Delphi客户端互传整数有解决方法。 1、服务端C#  byte[] data = BitConverter.GetBytes(123898);//data={250,227,1,0}  ClientSocket.Send(Data, 0, Data.Length, SocketFlags.None); 2、客户端...
  • 项目创建选项,C#控制台应用程序 需要引用 using System.Net.Scokets; using System.Net; 创建服务器Socket Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ...
  • 大小模式详解

    2013-05-13 23:48:23
    int i=1; char *p=(char *)&i; if(*p==1) printf("1... 大小存储问题,如果小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节处存放,cha
1 2 3 4 5 ... 20
收藏数 44,694
精华内容 17,877
关键字:

c# int 小端