2013-11-27 5 views
0

Я пытаюсь извлечь высоту из файла, как это: http://visibleearth.nasa.gov/view.php?id=73934Big-Endian Преобразование из текстуры

Пиксели загружаются в массив 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))); 
    } 

Я не знаю почему, но высоты неправильны ... Я думаю, что преобразование в Большой Эндиан не так, вы можете мне помочь?

это результат, высота выше, чем ожидалось ... http://i.imgur.com/FukdmLF.png

EDIT:

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); 
    } 

это нормально? Я не знаю, почему, но это все еще неправильно ...

ответ

0

int относится к 32-разрядному значению целого числа, но ваш байт-реверс записывается для 16-разрядного целого числа со знаком, поэтому он будет работать только для положительных значений до 32767 Если у вас есть какие-то значения выше, вам нужно будет сдвинуть, а затем замаскировать один байт за один раз, прежде чем «объединить» их вместе.