def unpack_data(str, x, nx, y, ny, pakking, missing, size)
case pakking.rstrip
when "1PAC", "I1"
natype = NArray::BYTE
byte = 1
type = "I1"
when "2PAC", "2UPC", "N1I2", "I2"
natype = NArray::SINT
byte = 2
type = "I2"
when "4PAC", "I4"
natype = NArray::INT
byte = 4
type = "I4"
when "R4"
natype = NArray::SFLOAT
byte = 4
type = "R4"
when "R8"
natype = NArray::DFLOAT
byte = 8
type = "R8"
when "RLEN"
raise "sorry, not suported"
else
raise "pakking is invalid"
end
case missing
when "UDFV"
mstr = str[0,byte]
str = str[byte..-1]
case type
when "I1"
miss = mstr.unpack("C")[0]
when "I2"
if pakking == "2UPC"
miss = mstr.unpack("n")[0]
else
miss = get_sint2(mstr)
end
when "I4"
miss = get_sint4(mstr)
when "R4"
miss = mstr.unpack("g")[0]
when "R8"
miss = mstr.unpack("G")[0]
else
raise "bug"
end
when "MASK"
len = size[0]*size[1]
n = (len-1)/8+1
mstr = str[0,n]
mask = NArray.byte(len)
mask[true] = mstr.unpack("B*")[0][0,len].unpack("c*")
mask -= 48
str = str[n..-1]
when "NONE"
else
raise "missing is invalid"
end
case pakking
when "1PAC", "2PAC", "2UPC"
b = str[0,4].unpack("g")[0]
a = str[4,4].unpack("g")[0]
str = str[8..-1]
when "4PAC"
b = str[0,8].unpack("G")[0]
a = str[8,8].unpack("G")[0]
str = str[16..-1]
when "RLEN"
nbit = str[0,4].unpack("N")[0]
maxv = str[4,4].unpack("N")[0]
num = str[8,4].unpack("N")[0]
str = [12,(nbit*num-1)/8+1]
end
if missing == "MASK"
ary = endian( NArray.to_na(str, natype) )
else
ary = endian( NArray.to_na(slice(str,x,nx,y,ny,size,byte), natype) )
end
if missing == "UDFV"
mask = ary.ne(miss)
end
case pakking
when "1PAC", "2PAC", "2UPC"
ary = ary.to_type(NArray::SFLOAT)
if pakking == "2UPC"
ma = ary.lt(0)
ary[ma] = 65536 + ary[ma]
end
ary *= a
ary += b
when "4PAC"
ary = ary.to_type(NArray::DFLOAT)
ary *= a
ary += b
when "N1I2"
ary = ary.to_type(NArray::SFLOAT)
ary /= 10
when "RLEN"
error
end
case missing
when "UDFV"
ary = NArrayMiss.to_nam_no_dup(ary, mask)
when "MASK"
ary2 = NArray.new(natype, size[0]*size[1])
ary2[mask] = ary
ary = NArrayMiss.to_nam_no_dup(ary2, mask)
x = Integer === x ? x..(x+nx-1) : x
y = Integer === y ? y..(y+ny-1) : y
ary.reshape!(size[0], size[1])
ary = ary[x,y]
end
ary.reshape!(nx, ny)
return ary
end