我正在努力将数据从长类型解压缩为两个数字。不知道我哪里出错了。
我通过将两个数字打包成一个长整数来创建一个唯一的数字:
public static long Squeeze(float x, float y)
{
return ((long)x << 32) | (long)y;
}
所以 long 由 x 的 4 个字节和 y 的 4 个字节组成。
然后我试图用以下方法恢复数字:
float x = (float)(hash >> 32);
float y = (float)(hash | int.MaxValue); // this should be 1111 1111 1111 1111 i think
但它似乎不起作用,x
似乎是正确的,但 y
给了我不应该的数字。
它也需要适用于负数。
示例:
(2.0, 9.0) => Packed: 8589934601 => Unpacked: (2, 1.073742E+10)
(-1.0, -1.0) => Packed: -1 => Unpacked: (-1.0, -2147484000.0)
最佳答案
您应该使用BitConverter
而不是强制转换:
public static long Squeeze(float x, float y)
{
var bytes = new byte[8];
BitConverter.GetBytes(x).CopyTo(bytes, 0);
BitConverter.GetBytes(y).CopyTo(bytes, 4);
return BitConverter.ToInt64(bytes, 0);
}
和
public static void Unpack(long value, out float x, out float y)
{
var bytes = BitConverter.GetBytes(value);
x = BitConverter.ToSingle(bytes, 0);
y = BitConverter.ToSingle(bytes, 4);
}
只要您不将字节数组传输出程序,系统使用小端还是大端字节顺序并不重要。如果需要了解可以查看BitConverter.IsLittleEndian
.
关于c# - 按位将 long 解包为两个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59383237/