@@ -1092,54 +1092,62 @@ private float[] getData42(RandomAccessFile raf, Grib2Drs.Type42 gdrs) throws IOE
10921092 byte [] inputData = new byte [encodedLength ];
10931093 raf .readFully (inputData );
10941094
1095- int nbytesPerSample = (gdrs .numberOfBits + 7 ) / 8 ;
1096-
1097- try (Memory inputMemory = new Memory (encodedLength );
1098- Memory outputMemory = new Memory ((long ) nbytesPerSample * totalNPoints )) {
1095+ float [] data ;
1096+ if (encodedLength > 0 ) {
1097+ int nbytesPerSample = (gdrs .numberOfBits + 7 ) / 8 ;
10991098
1100- // set encoding parameters
1101- AecStream aecStreamDecode = AecStream .create (gdrs .numberOfBits , gdrs .blockSize , gdrs .referenceSampleInterval ,
1102- gdrs .compressionOptionsMask );
1099+ try (Memory inputMemory = new Memory (encodedLength );
1100+ Memory outputMemory = new Memory ((long ) nbytesPerSample * totalNPoints )) {
11031101
1104- // load data from grib message into memory
1105- inputMemory .write (0 , inputData , 0 , inputData .length );
1102+ // set encoding parameters
1103+ AecStream aecStreamDecode = AecStream .create (gdrs .numberOfBits , gdrs .blockSize , gdrs .referenceSampleInterval ,
1104+ gdrs .compressionOptionsMask );
11061105
1107- aecStreamDecode . setInputMemory ( inputMemory );
1108- aecStreamDecode . setOutputMemory ( outputMemory );
1106+ // load data from grib message into memory
1107+ inputMemory . write ( 0 , inputData , 0 , inputData . length );
11091108
1110- // decode
1111- int ok = LibAec .aec_buffer_decode (aecStreamDecode );
1112- if (ok != AEC_OK ) {
1113- System .out .printf ("AEC Error: %s%n" , ok );
1114- }
1109+ aecStreamDecode .setInputMemory (inputMemory );
1110+ aecStreamDecode .setOutputMemory (outputMemory );
11151111
1116- // read decoded data from native memory
1117- decodedData = new byte [nbytesPerSample * totalNPoints ];
1118- outputMemory .read (0 , decodedData , 0 , decodedData .length );
1119- }
1120-
1121- // will use this to read out a long value using nbytesPerSample bytes
1122- // see long getNextLong(ByteBuffer bb, int numberOfBytes)
1123- ByteBuffer bb = ByteBuffer .wrap (decodedData );
1112+ // decode
1113+ int ok = LibAec .aec_buffer_decode (aecStreamDecode );
1114+ if (ok != AEC_OK ) {
1115+ System .out .printf ("AEC Error: %s%n" , ok );
1116+ }
11241117
1125- // decode following regulation 92.9.4, Note 4
1126- int D = gdrs .decimalScaleFactor ;
1127- float DD = (float ) Math .pow ((double ) 10 , (double ) D );
1128- float R = gdrs .referenceValue ;
1129- int E = gdrs .binaryScaleFactor ;
1130- float EE = (float ) Math .pow (2.0 , (double ) E );
1131- float [] data = new float [decodedData .length ];
1132- if (bitmap == null ) {
1133- for (int i = 0 ; i < totalNPoints ; i ++) {
1134- data [i ] = (R + getNextLong (bb , nbytesPerSample ) * EE ) / DD ;
1118+ // read decoded data from native memory
1119+ decodedData = new byte [nbytesPerSample * totalNPoints ];
1120+ outputMemory .read (0 , decodedData , 0 , decodedData .length );
11351121 }
1136- } else {
1137- for (int i = 0 ; i < totalNPoints ; i ++) {
1138- if (GribNumbers .testBitIsSet (bitmap [i / 8 ], i % 8 )) {
1122+
1123+ // will use this to read out a long value using nbytesPerSample bytes
1124+ // see long getNextLong(ByteBuffer bb, int numberOfBytes)
1125+ ByteBuffer bb = ByteBuffer .wrap (decodedData );
1126+
1127+ // decode following regulation 92.9.4, Note 4
1128+ int D = gdrs .decimalScaleFactor ;
1129+ float DD = (float ) Math .pow ((double ) 10 , (double ) D );
1130+ float R = gdrs .referenceValue ;
1131+ int E = gdrs .binaryScaleFactor ;
1132+ float EE = (float ) Math .pow (2.0 , (double ) E );
1133+ data = new float [decodedData .length ];
1134+ if (bitmap == null ) {
1135+ for (int i = 0 ; i < totalNPoints ; i ++) {
11391136 data [i ] = (R + getNextLong (bb , nbytesPerSample ) * EE ) / DD ;
1140- } else {
1141- data [i ] = staticMissingValue ;
11421137 }
1138+ } else {
1139+ for (int i = 0 ; i < totalNPoints ; i ++) {
1140+ if (GribNumbers .testBitIsSet (bitmap [i / 8 ], i % 8 )) {
1141+ data [i ] = (R + getNextLong (bb , nbytesPerSample ) * EE ) / DD ;
1142+ } else {
1143+ data [i ] = staticMissingValue ;
1144+ }
1145+ }
1146+ }
1147+ } else {
1148+ data = new float [totalNPoints ];
1149+ if (gdrs .referenceValue != 0 ) {
1150+ Arrays .fill (data , gdrs .referenceValue );
11431151 }
11441152 }
11451153 return data ;
0 commit comments