如何调用此二进制数据类型,以及如何在C#中处理它?

如何调用此二进制数据类型,以及如何在C#中处理它?,c#,file,binary,byte,C#,File,Binary,Byte,假设我们有一个二进制文件,其中包含2个字节,它们形成一个整数,反之亦然 例如,字节显示如下:(十六进制) 这应该解释为: 00 00 03 EB 哪个C#应该能够以十进制形式输入1003。如果内存中已存在两个不同变量中的EB和03字节,是否可能出现这种情况?在这里,我是否可以应用一些数学知识,从数字235和3形成十进制1003?或者我应该做完全不同的事情 提前谢谢 您应该能够将二进制文件中的值读入无符号32位整数: UInt32 myValue; 从BinaryReader对象使用此方法:

假设我们有一个二进制文件,其中包含2个字节,它们形成一个整数,反之亦然

例如,字节显示如下:(十六进制)

这应该解释为:

00 00 03 EB
哪个C#应该能够以十进制形式输入
1003
。如果内存中已存在两个不同变量中的
EB
03
字节,是否可能出现这种情况?在这里,我是否可以应用一些数学知识,从数字
235
3
形成十进制
1003
?或者我应该做完全不同的事情


提前谢谢

您应该能够将二进制文件中的值读入无符号32位整数:

UInt32 myValue;
BinaryReader
对象使用此方法:

myValue = reader.ReadUInt32();
在Little Endian系统(即Intel)上,字节顺序将自动反转

要获取字节数组,请执行以下操作:

byte[] b = BitConverter.GetBytes(myValue);

你们所说的是所谓的,特别是小尾端格式

在C#中,使用或
BinaryWriter
从二进制文件中读取字节顺序的正确转换可能是最容易的

以下示例显示如何使用
二进制读取器
以小端格式获取数字的正确整数解释:

using System.IO;

class EndiannessSample
{
    static void Main(string[] args)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            // write bytes in little-endian format
            ms.WriteByte(0xEB);
            ms.WriteByte(0x03);
            ms.WriteByte(0x00);
            ms.WriteByte(0x00);
            ms.Position = 0;

            using (BinaryReader reader = new BinaryReader(ms))
            {
                int i = reader.ReadInt32(); // decimal value of i is 1003
            }
        }
    }
}
Little endian是Intel(和Windows)平台上的标准。如果您必须处理Big-Endian格式的数据(例如,在导入旧Macintosh上创建的文件时),.NET中没有直接的支持。您可以使用
位转换器
类编写一个简单的实用程序函数来转换endianness。在上面的示例中,您可以执行以下操作来处理Big-Endian(在小Endian平台上):

提供了一个链接,进一步讨论了与Endian相关的问题,例如,针对Xbox 360(碰巧是一个Big Endian平台)时:

更新

库提供了一个二进制读写器类,可以针对特定的尾端进行配置:

MiscUtil.IO.EndianBinary{Writer/Reader}
这叫做Little Endian,它是Windows中的正常字节顺序

您可以使用
BinaryReader
从这种形式的流中读取整数

如果你想推出自己的

var b1 = file.ReadByte();
var b2 = file.ReadByte();
var b3 = file.ReadByte();
var b4 = file.ReadByte();
var result = b1 | (b2 << 8) | (b3 << 16) | (b4 << 24);
var b1=file.ReadByte();
var b2=file.ReadByte();
var b3=file.ReadByte();
var b4=file.ReadByte();
var结果=b1 |(b2
如果您有EB,这可能吗
2的内存中已经有03个字节
不同的变量

是的

byte x = 0xEB;
byte y = 0x03;

int i = (y << 8) | x;
// or
short s = (short)((y << 8) | x);
您可以使用Robert提到的类。一个简单的示例:

     byte[] byte_arr = new byte[] { 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89 };
     UInt16 uint1 = BitConverter.ToUInt16(byte_arr, 0); // 0x2312
     UInt16 uint2 = BitConverter.ToUInt16(byte_arr, 4); // 0x6756

谢谢你的快速回答!但是如果我有一个字节数组,我怎么做呢?比如bData[0]是EB,bData[1]=03,bData[2]=00和bData[3]=00。是否将无符号短变量设置为bData[0]+bData[1]…[3]工作?@Angelo:您可以在框架中使用BitConverter类在字节数组和UInt16值之间进行转换。@Angelo:为什么要将字节加在一起工作?只需按照0xA3所说的做:使用
BinaryReader.ReadUint32
。我可以看到您进行向下投票,但我认为您是反向投票的。我以前在英特尔系统上做过这样的操作。这种方法是r为我设置负值。知道为什么吗?LukeH的方法对我有效,但只有2个字节。我认为上面的Timwi做得不对。我说得对吗?@Robert:我编译了我的代码,它按预期生成了输出
1003
。@0xA3:请告诉我哪里错了,然后我会修复它。代码很好,但没有必要。我如果你在英特尔机器上读
Int32
UInt32
,使用
BinaryReader
,你的字节顺序会很好。而且不是大端。@Angelo:你没有问4个字节,但我也会编辑来涵盖。Luke,Timwi对他的答案的编辑对我来说很有用。别担心;)这也是一个很好的答案。我喜欢这些方法!谢谢好吧,我对这个投赞成票,因为它是正确的,也是最完整的答案。同上。它永远不应该被否决,即使它只是正确且简短。@0xA3:值得注意的是,位转换器类中有一个名为
IsLittleEndian
的静态只读布尔成员,该成员设置为
true
。从理论上讲,如果该框架被移植到Posix系统,他们可以将该成员设置为
false
,一切都应该正常。@Robert:这不仅仅是理论上的可能性:XBox 360是big-endian,运行该框架的一个版本;也有可能——我不确定——compact框架可能运行在一些big-endian平台上;当然,还有单核细胞增多症。如果无论代码在何处运行,都需要固定尾数,则不能使用
位转换器
,因为它始终使用当前系统尾数。
byte[] b = ...;
var result = b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
byte x = 0xEB;
byte y = 0x03;

int i = (y << 8) | x;
// or
short s = (short)((y << 8) | x);
byte a = 0x01;
byte b = 0x02;  
byte c = 0x03;
byte d = 0x04;

int i = (a << 24) | (b << 16) | (c << 8) | d;
// or if you want to reverse the endianness...
int j = (d << 24) | (c << 16) | (b << 8) | a;
     byte[] byte_arr = new byte[] { 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89 };
     UInt16 uint1 = BitConverter.ToUInt16(byte_arr, 0); // 0x2312
     UInt16 uint2 = BitConverter.ToUInt16(byte_arr, 4); // 0x6756