Ayrıca Endian
bir sınıf olarak adlandırılan olduğu dikkate endian alan bir bayt dizisi ve çeşitli basit türler arasında dönüştürme yöntemleri uygulayan Jon Skeet en miscutil library. FromBytes
soyut yöntem için farklı uygulanmıştır sonra
public abstract class Endian
{
public short ToInt16(byte[] value, int startIndex)
{
return unchecked((short)FromBytes(value, startIndex, 2));
}
public int ToInt32(byte[] value, int startIndex)
{
return unchecked((int)FromBytes(value, startIndex, 4));
}
public long ToInt64(byte[] value, int startIndex)
{
return FromBytes(value, startIndex, 8);
}
// This same method can be used by int16, int32 and int64.
protected virtual long FromBytes(byte[] buffer, int startIndex, int len);
}
Ve: bir şey gibi Endian sınıfından bir versiyonu olduğunu düşünüyorsanız
// Input data
byte[] tab = new byte[32];
// Pick the appropriate endianness
Endian endian = Endian.Little;
// Use the appropriate endian to convert
int a = endian.ToInt32(tab, 0);
int b = endian.ToInt32(tab, 4);
int c = endian.ToInt32(tab, 8);
int d = endian.ToInt32(tab, 16);
...
: Sorunuza için
, kullanım gibi bir şey olurdu her bir endian tipi.
public class BigEndian : Endian
{
protected override long FromBytes(byte[] buffer, int startIndex, int len)
{
long ret = 0;
for (int i=0; i < len; i++)
{
ret = unchecked((ret << 8) | buffer[startIndex+i]);
}
return ret;
}
}
public class LittleEndian : Endian
{
protected override long FromBytes(byte[] buffer, int startIndex, int len)
{
long ret = 0;
for (int i=0; i < len; i++)
{
ret = unchecked((ret << 8) | buffer[startIndex+len-1-i]);
}
return ret;
}
}
Performansa rağmen, diziyi her defasında tersine çevirmek yerine, Büyük ve Küçük endian için iki ayrı sınıfa sahip olmak daha iyi olurdu. Dahası, OP'nin asıl sorusu 4 inçlik bir diziye sahip olduğundan, tek tek 4 baytlık kelimeler tersine çevrilmelidir. Sistem mimarisi önceden bilindiğinden, OOP yaklaşımı daha mantıklı olacaktır. – Groo
@ Groo: Posterin kod snippet'inin 4 baytlık bir dizisi var –