C# Mono DataConvert能否用于读取3字节整数?
我试图读取一个特定的二进制文件,但它包含3字节的大端整数。我最近遇到过,除了这些3字节整数之外,这对于我想要的大多数东西来说都是不错的。我不知道怎么读。请注意,我不需要将它们保留为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
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语言中有更好的方法。我现在看到了。这是漫长的一天。