我正试图从这样的文件中提取高度:http://visibleearth.nasa.gov/view.php?id=73934
像素被加载到Int32阵列中
private Int16[] heights;
private int Width, Height;
public TextureData(Texture2D t)
{
Int32[] data = new Int32[t.Width * t.Height];
t.GetData<Int32>(data);
Width = t.Width;
Height = t.Height;
t.Dispose();
heights= new Int16[t.Width * t.Height];
for (int i = 0; i < data.Length; ++i)
{
heights[i] = ReverseBytes(data[i]);
}
}
// reverse byte order (16-bit)
public static Int16 ReverseBytes(Int32 value)
{
return (Int16)( ((value << 8) | (value >> 8)) );
}
我不知道为什么,但是高度不对。。。我认为大恩迪亚的转换是错误的,你能帮我吗?
这就是结果,高度比预期的要高。。。https://i.stack.imgur.com/LTGjp.png
编辑:
public static int ReverseBytes(int value)
{
int sign = (value & 0x8000) >> 15;
int msb = (value & 0x7F) >> 7;
int lsb = (value & 0xFF) << 8;
return (msb | lsb | sign);
}
这样可以吗?我不知道为什么,但这仍然是错误的。。。
int指的是一个32位有符号整数,但字节反向器是为一个16位有符号的整数编写的,因此它只适用于32767以下的正值。如果有任何值高于此值,则需要先进行移位,然后一次屏蔽一个字节,然后再将它们"orring"在一起。