C# Mono DataConvert能否用于读取3字节整数?

C# Mono DataConvert能否用于读取3字节整数?,c#,mono,data-conversion,endianness,C#,Mono,Data Conversion,Endianness,我试图读取一个特定的二进制文件,但它包含3字节的大端整数。我最近遇到过,除了这些3字节整数之外,这对于我想要的大多数东西来说都是不错的。我不知道怎么读。请注意,我不需要将它们保留为3字节整数,将它们读入常规的Int32将是理想的选择。我正在读取大量数据,所以我在寻找一些有效的方法。有什么建议吗 理想代码示例: public Region(string regionFile) { var conv = DataConverter.BigEndian; var chunks = n

我试图读取一个特定的二进制文件,但它包含3字节的大端整数。我最近遇到过,除了这些3字节整数之外,这对于我想要的大多数东西来说都是不错的。我不知道怎么读。请注意,我不需要将它们保留为3字节整数,将它们读入常规的
Int32
将是理想的选择。我正在读取大量数据,所以我在寻找一些有效的方法。有什么建议吗


理想代码示例:

public Region(string regionFile)
{
    var conv = DataConverter.BigEndian;
    var chunks = new Chunk[Chunk.MaxLocations];
    using (var fs = File.OpenRead(regionFile))
    {
        var buffer = new byte[4096];
        fs.Read(buffer, 0, buffer.Length);

        // Read chunk locations
        for (int i = 0; i < Chunk.MaxLocations; ++i)
        {
            chunks[i] = new Chunk(conv.ToInt24(buffer, i * 4), buffer[i * 4 + 3]);
        }
    }
}
公共区域(字符串区域文件)
{
var conv=DataConverter.BigEndian;
var chunks=新块[Chunk.MaxLocations];
使用(var fs=File.OpenRead(regionFile))
{
var buffer=新字节[4096];
fs.Read(buffer,0,buffer.Length);
//读取区块位置
对于(int i=0;i

我想做类似的事情,除了
conv.ToInt24
不存在。我想我可以通过位移位来写我自己的…

我复制了Mono的
GetInt32
并对其进行了轻微修改:

public override int GetInt24(byte[] data, int index)
{
    if (data == null)
        throw new ArgumentNullException("data");
    if (data.Length - index < 3)
        throw new ArgumentException("index");
    if (index < 0)
        throw new ArgumentException("index");

    int ret = 0;
    byte* b = (byte*)&ret;

    for (int i = 0; i < 3; i++)
        b[2 - i] = data[index + i];

    return ret;
}
public override int GetInt24(字节[]数据,int索引)
{
如果(数据==null)
抛出新的异常(“数据”);
如果(数据长度-索引<3)
抛出新的ArgumentException(“索引”);
如果(指数<0)
抛出新的ArgumentException(“索引”);
int-ret=0;
字节*b=(字节*)&ret;
对于(int i=0;i<3;i++)
b[2-i]=数据[指数+i];
返回ret;
}

似乎有效。

您知道3字节整数的格式吗?它是否与带有额外字节的标准int相同?@M.Babcock:似乎是,是的。除了它是Big-Endian,我需要将它转换为我的原生格式(Little-Endian)。如果我能用额外的0字节填充它,我就能够很好地读取,但我不确定有什么好方法可以做到这一点。我想读入文件的一部分(比如4kib),然后在上面循环,根据需要转换不同的部分。通常我只会调用
converter.GetInt32(theData,myOffset)
,但是它会读入下一个字节,这是不起作用的。看起来这不受
Mono.DataConvert
的支持(正如人们所期望的),但是定义一个3字节的结构来为您进行转换应该不会太困难。无论如何,这听起来像是一个有趣的项目(不应该比我用来让RTMP工作的滚动7位int更难)。考虑到你说这是一个
int
,我认为典型的两个互补标志适用,对吗\@M. Babcock:SPEC没有具体说,但是这个<代码>(数据[index +0 ],我在C++中是如何做的。我不能说C语言中有更好的方法。我现在看到了。这是漫长的一天。