Etes-vous sûr que chaque valeur de votre tableau de valeurs s'inscrit dans un Int16?
Sinon, même si vous décochez la case, le résultat n'est pas ce que vous voulez. D'abord vous devrez décider quoi faire si les valeurs [0] ou les valeurs 1 sont plus grandes que les ajustements dans un Int16.
Votre décision dépend de ce que signifient les valeurs. Est-ce que les valeurs [0] représentent les 16 bits les plus élevés de votre Int32 et les valeurs [0] les 16 bits les plus bas?
Dans ce cas, vous devriez lancer une ArgumentException si les valeurs [0] ou les valeurs 1 sont supérieures à Int16.MaxValue. Après que votre code est facile:
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;
Cela pourrait également signifier qu'il est admis que les deux valeurs sont plus que 0x10000, vous devriez penser à vous-même ce que vous voulez en conséquence si les chiffres sont trop gros. Par ailleurs, si vos valeurs représentent chacune la moitié d'un Int32, pensez à changer la signification des valeurs [0] et des valeurs 1. Presque toujours les bits les moins significatifs (LSB) sont dans [0], tandis que les bits les plus significatifs (MSB) sont dans 1.Si vous suivez cette convention, vous n'avez pas à écrire ces convertisseurs vous-même, vous pouvez utiliser le 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);
utilisation 'uncheck' pour contourner. – Bauss
@Bauss Droite, qui corrige superficiellement le logiciel, mais le calcul n'est toujours pas comme souhaité. – Codor
L'extension de signe est probablement à l'origine de l'erreur. Essayez ceci: uint pesoparz = ((valeurs [1] & 0xFFFF) << 16) | (valeurs [0] et 0xFFFF); – jdweng