Cho mã sau đóng gói bốn byte
giá trị vào một uint
.Hoạt động toán học trên các giá trị số được đóng gói
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);
}
Có thể áp dụng khai thác toán học như *, +,/and -
trên giá trị theo cách mà nó có thể được giải nén vào đúng byte
tương đương?
EDIT.
Để làm rõ, nếu tôi cố gắng để nhân giá trị bằng một giá trị đóng gói
uint result = this.PackedValue * other.PackedValue
Sau đó giải nén bằng cách sử dụng sau đây ...
public byte[] ToBytes()
{
return new[]
{
(byte)(this.PackedValue & 0xFF),
(byte)((this.PackedValue >> 8) & 0xFF),
(byte)((this.PackedValue >> 16) & 0xFF),
(byte)((this.PackedValue >> 24) & 0xFF)
};
}
tôi nhận được kết quả sai.
Đây là mẫu mã đầy đủ hiển thị kết quả mong đợi và thực tế.
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)
};
}
Tại sao bạn không thử? –
@roryap Tôi có nhưng tôi nhận được các giá trị sai trở lại, một cái gì đó đang tràn. –
Ahhh, tôi sẽ nói bạn nên bao gồm một chút trong câu hỏi của bạn. –