Dato il seguente codice, imballaggio di quattro valori byte
in un valore uint
.Operazioni matematiche su valori numerici preconfezionati
private static void Pack(byte x, byte y, byte z, byte w)
{
this.PackedValue = (uint)x |
((uint)y << 8) |
((uint)z << 16) |
((uint)w << 24);
}
E 'possibile applicare gli operatori matematici come *, +,/and -
sul valore in modo che possa essere scompattato nella corretta byte
equivalente?
MODIFICA.
per chiarire, se tento di moltiplicare il valore per un altro imballato
uint result = this.PackedValue * other.PackedValue
Poi decomprimere utilizzando il seguente ...
public byte[] ToBytes()
{
return new[]
{
(byte)(this.PackedValue & 0xFF),
(byte)((this.PackedValue >> 8) & 0xFF),
(byte)((this.PackedValue >> 16) & 0xFF),
(byte)((this.PackedValue >> 24) & 0xFF)
};
}
ottengo i risultati errati.
Ecco un esempio di codice completo che mostra il risultato previsto ed effettivo.
void Main()
{
uint x = PackUint(128, 128, 128, 128);
uint y = (uint)(x * 1.5f);
byte[] b1 = ToBytes(x);
x.Dump(); // 2155905152
b1.Dump(); // 128, 255, 128, 255 RIGHT!
byte[] b2 = ToBytes(y);
b2.Dump(); // 0, 192, 192, 192 WRONG! Should be 192, 192, 192, 192
}
// Define other methods and classes here
private static uint PackUint(byte x, byte y, byte z, byte w)
{
return ((uint)x) |
((uint)y << 8) |
((uint)z << 16) |
((uint)w << 24);
}
public static byte[] ToBytes(uint packed)
{
return new[]
{
(byte)(packed & 0xFF),
(byte)((packed >> 8) & 0xFF),
(byte)((packed >> 16) & 0xFF),
(byte)((packed >> 24) & 0xFF)
};
}
Perché non ci provi? –
@roryap Ho ma sto riportando i valori sbagliati, qualcosa sta traboccando. –
Ahhh, beh, direi che dovresti includere quel po 'nella tua domanda. –