Czy jesteś pewien, że każda wartość twojej tablicy wartości mieści się w klasie Int16?
Jeśli nie, to nawet jeśli odznaczysz się, wynik nie jest tym, czego potrzebujesz. Najpierw musisz zdecydować, co zrobić, jeśli wartości [0] lub wartości 1 są większe niż pasują w klasie Int16.
Twoja decyzja zależy od tego, co oznaczają wartości. Czy wartości [0] reprezentują najwyższe 16 bitów wynikowego Int32 i wartości [0] najniższych 16 bitów?
W takim przypadku należy rzucić wyjątek ArgumentException, jeśli wartości [0] lub wartości 1 jest większa niż Int16.MaxValue. Po, że kod jest proste:
if (values[0] > Int16.MaxValue || values[1] > Int16.MaxValue)
throw new ArgumentException("values should fit in two bytes");
Int32 result = values[0] << 0x10000 + values[1];
return result;
Może to również oznaczać, że jest to dozwolone, że obie wartości są więcej niż 0x10000, należy myśleć o sobie, co chcesz w wyniku jeśli numery są zbyt duże.
Nawiasem mówiąc, jeśli wartości reprezentują połowę wartości Int32, należy rozważyć zmianę znaczenia wartości [0] i wartości 1. Prawie zawsze najmniej znaczące bity (LSB) są w [0], podczas gdy najbardziej znaczące bity (MSB) są w 1.Jeśli zastosujemy się do tej konwencji, nie trzeba pisać tych konwerterów siebie, można użyć BitConverter class
Int32 original = 0x12345678;
byte[] bytes = BitConverter.GetBytes(original);
foreach (var b in bytes)
Console.WriteLine(b.ToString("02X"); // write in two digit hex format
// will write lines with 78 56 34 12
Int16[] Values = new Int16[]
{
BitConverter.ToInt16(bytes), // LSB
BitConverter.ToInt16(bytes, 2), // MSB
};
Int32 result = (Int32)values[0] + (Int32)values[1] << 0x10000;
Debug.Assert(original == result);
użycie 'uncheck' aby uzyskać wokół niego. – Bauss
@Bauss Dobrze, że powierzchownie naprawia oprogramowanie, ale obliczenia wciąż nie są tak pożądane. – Codor
Rozszerzenie znaku prawdopodobnie powoduje błąd. Spróbuj: uint pesoparz = ((wartości [1] i 0xFFFF) << 16) | (wartości [0] i 0xFFFF); – jdweng