Index: src/client/c/hu/varadiistvan/xplra/XPlane.cc
===================================================================
--- src/client/c/hu/varadiistvan/xplra/XPlane.cc	(revision 15)
+++ src/client/c/hu/varadiistvan/xplra/XPlane.cc	(revision 16)
@@ -49,4 +49,5 @@
 
 using std::auto_ptr;
+using std::string;
 
 //------------------------------------------------------------------------------
@@ -181,4 +182,107 @@
 //------------------------------------------------------------------------------
 
+size_t XPlane::getArray(const char* name, uint8_t type,
+                        ssize_t length, size_t offset) throw(Exception)
+{
+    checkStream();
+
+    stream->writeU8(Protocol::COMMAND_GET_SINGLE);
+    stream->writeString(name, strlen(name));
+    stream->writeU8(type);
+    stream->writeS32(static_cast<int32_t>(length));
+    stream->writeS32(static_cast<int32_t>(offset));
+    if (!stream->flush()) checkStream();
+
+    uint8_t result = stream->readU8();
+    length = stream->readS32();
+    checkStream();
+    checkResult(result);
+
+    return length;
+}
+
+//------------------------------------------------------------------------------
+
+size_t XPlane::getFloatArray(const char* name, float* dest,
+                             size_t length, size_t offset) throw(Exception)
+{
+    length = getArray(name, Protocol::TYPE_FLOAT_ARRAY, length, offset);
+
+    if (!stream->read(dest, length*sizeof(float))) checkStream();
+
+    return length;
+}
+
+//------------------------------------------------------------------------------
+
+float* XPlane::getFloatArray(const char* name, size_t& length,
+                             size_t offset) throw(Exception)
+{
+    length = getArray(name, Protocol::TYPE_FLOAT_ARRAY, -1, offset);
+
+    auto_ptr<float> data(new float[length]);
+    if (!stream->read(data.get(), length*sizeof(float))) checkStream();
+    return data.release();
+}
+
+//------------------------------------------------------------------------------
+
+size_t XPlane::getIntArray(const char* name, int32_t* dest,
+                           size_t length, size_t offset) throw(Exception)
+{
+    length = getArray(name, Protocol::TYPE_INT_ARRAY, length, offset);
+
+    if (!stream->read(dest, length*sizeof(int32_t))) checkStream();
+
+    return length;
+}
+
+//------------------------------------------------------------------------------
+
+int32_t* XPlane::getIntArray(const char* name, size_t& length,
+                             size_t offset) throw(Exception)
+{
+    length = getArray(name, Protocol::TYPE_INT_ARRAY, -1, offset);
+
+    auto_ptr<int32_t> data(new int32_t[length]);
+    if (!stream->read(data.get(), length*sizeof(int32_t))) checkStream();
+    return data.release();
+}
+
+//------------------------------------------------------------------------------
+
+size_t XPlane::getByteArray(const char* name, uint8_t* dest,
+                            size_t length, size_t offset) throw(Exception)
+{
+    length = getArray(name, Protocol::TYPE_BYTE_ARRAY, length, offset);
+
+    if (!stream->read(dest, length*sizeof(uint8_t))) checkStream();
+
+    return length;
+}
+
+//------------------------------------------------------------------------------
+
+uint8_t* XPlane::getByteArray(const char* name, size_t& length,
+                              size_t offset) throw(Exception)
+{
+    length = getArray(name, Protocol::TYPE_BYTE_ARRAY, -1, offset);
+
+    auto_ptr<uint8_t> data(new uint8_t[length]);
+    if (!stream->read(data.get(), length*sizeof(uint8_t))) checkStream();
+    return data.release();
+}
+
+//------------------------------------------------------------------------------
+
+string XPlane::getString(const char* name, size_t offset) throw(Exception)
+{
+    size_t length = 0;
+    auto_ptr<uint8_t> data(getByteArray(name, length, offset));
+    return string(reinterpret_cast<char*>(data.get()));
+}
+
+//------------------------------------------------------------------------------
+
 // Local Variables:
 // mode: C++
Index: src/client/c/hu/varadiistvan/xplra/XPlane.h
===================================================================
--- src/client/c/hu/varadiistvan/xplra/XPlane.h	(revision 15)
+++ src/client/c/hu/varadiistvan/xplra/XPlane.h	(revision 16)
@@ -118,4 +118,69 @@
     double getDouble(const char* name) throw(Exception);
 
+    /**
+     * Get a possibly partial array of floats.
+     *
+     * @param length the length of the destination buffer
+     * @param offset the offset from which to get the array
+     *
+     * @return the number of values acquired actually
+     */
+    size_t getFloatArray(const char* name, float* dest,
+                         size_t length, size_t offset = 0) throw(Exception);
+
+    /**
+     * Get a possibly partial array of floats. The result array will
+     * be created with a length needed to hold the returned value.
+     *
+     * @param offset the offset from which to get the array
+     */
+    float* getFloatArray(const char* name, size_t& length,
+                         size_t offset = 0) throw(Exception);
+
+    /**
+     * Get a possibly partial array of integers.
+     *
+     * @param length the length of the destination buffer
+     * @param offset the offset from which to get the array
+     *
+     * @return the number of values acquired actually
+     */
+    size_t getIntArray(const char* name, int32_t* dest,
+                       size_t length, size_t offset = 0) throw(Exception);
+
+    /**
+     * Get a possibly partial array of integers. The result array will
+     * be created with a length needed to hold the returned value.
+     *
+     * @param offset the offset from which to get the array
+     */
+    int32_t* getIntArray(const char* name, size_t& length,
+                         size_t offset = 0) throw(Exception);
+
+    /**
+     * Get a possibly partial array of bytes.
+     *
+     * @param length the length of the destination buffer
+     * @param offset the offset from which to get the array
+     *
+     * @return the number of values acquired actually
+     */
+    size_t getByteArray(const char* name, uint8_t* dest,
+                        size_t length, size_t offset = 0) throw(Exception);
+
+    /**
+     * Get a possibly partial array of bytes. The result array will
+     * be created with a length needed to hold the returned value.
+     *
+     * @param offset the offset from which to get the array
+     */
+    uint8_t* getByteArray(const char* name, size_t& lengyh,
+                          size_t offset = 0) throw(Exception);
+
+    /**
+     * Get a string. A string is a byte array.
+     */
+    std::string getString(const char* name, size_t offset = 0) throw(Exception);
+
 private:
     /**
@@ -135,4 +200,15 @@
      */
     void getScalar(const char* name, uint8_t type) throw(Exception);
+
+    /**
+     * Issue the command to get an array of values of the given
+     * type. It checks the result and retrieves the number of value
+     * items available.
+     *
+     * @return the number of value items available
+     */
+    size_t getArray(const char* name, uint8_t type,
+                    ssize_t length, size_t offset) throw(Exception);
+
 };
 
Index: test/basictest.cc
===================================================================
--- test/basictest.cc	(revision 15)
+++ test/basictest.cc	(revision 16)
@@ -39,4 +39,6 @@
 using hu::varadiistvan::xplra::ProtocolException;
 
+using std::string;
+
 //------------------------------------------------------------------------------
 
@@ -75,4 +77,60 @@
         printf("The coordinates: %f, %f\n\n", latitude, longitude);
 
+        printf("Querying the aircraft's description as an array of a fixed size...\n");
+        uint8_t result[260];
+        size_t length = xplane.getByteArray("sim/aircraft/view/acf_descrip",
+                                            result, sizeof(result)/sizeof(result[0]));
+        printf("Got %zu bytes, as a string: '%s'\n\n", length, result);
+
+        printf("Querying the aircraft's description as a dynamically created array...\n");
+        uint8_t* result1 = xplane.getByteArray("sim/aircraft/view/acf_descrip", length);
+        printf("Got %zu bytes, as a string: '%s'\n\n", length, result1);
+
+        printf("Querying the aircraft's description as a string, with an offset of 3...\n");
+        string result2 = xplane.getString("sim/aircraft/view/acf_descrip", 3);
+        printf("Got: '%s'\n\n", result2.c_str());
+
+        printf("Querying the aircraft's engine types as an array of a fixed size...\n");
+        int32_t result3[8];
+        length = xplane.getIntArray("sim/aircraft/prop/acf_en_type",
+                                    result3, sizeof(result3)/sizeof(result3[0]));
+        printf("Got %zu values:", length);
+        for(size_t i = 0; i<length; ++i) {
+            if (i>0) printf(",");
+            printf(" %d", result3[i]);
+        }
+        printf("\n\n");
+
+        printf("Querying the aircraft's engine types as a dynamically created array...\n");
+        length = 0;
+        int32_t* result4 = xplane.getIntArray("sim/aircraft/prop/acf_en_type", length);
+        printf("Got %zu values:", length);
+        for(size_t i = 0; i<length; ++i) {
+            if (i>0) printf(",");
+            printf(" %d", result4[i]);
+        }
+        printf("\n\n");
+
+        printf("Querying the aircraft's propeller direction as an array of a fixed size...\n");
+        float result5[8];
+        length = xplane.getFloatArray("sim/aircraft/prop/acf_prop_dir",
+                                      result5, sizeof(result5)/sizeof(result5[0]));
+        printf("Got %zu values:", length);
+        for(size_t i = 0; i<length; ++i) {
+            if (i>0) printf(",");
+            printf(" %f", result5[i]);
+        }
+        printf("\n\n");
+
+        printf("Querying the aircraft's propeller direction as a dynamically created array...\n");
+        length = 0;
+        float* result6 = xplane.getFloatArray("sim/aircraft/prop/acf_prop_dir", length);
+        printf("Got %zu values:", length);
+        for(size_t i = 0; i<length; ++i) {
+            if (i>0) printf(",");
+            printf(" %f", result6[i]);
+        }
+        printf("\n\n");
+
         return 0;
     } catch(const Exception& exception) {
