public ChassisFruWriteRequest(ushort offset, ushort length, byte[] dataToWrite)
            {
                byte lowOffset, highOffset, lowLength, highLength;

                IpmiSharedFunc.SplitWord(offset, out lowOffset, out highOffset);

                IpmiSharedFunc.SplitWord(length, out lowLength, out highLength);

                this.lowOffset   = lowOffset;
                this.highOffset  = highOffset;
                this.lowLength   = lowLength;
                this.highLength  = highLength;
                this.dataToWrite = dataToWrite;
            }
        /// <summary>
        /// Returns a byte array with all bytes from a specific area of the fru: Chassis, Baseboard, Product
        /// </summary>
        private byte[] ReadFruAreaBytes(DeviceType deviceType, byte deviceId, ushort offset, bool maxLenght, out byte completionCode)
        {
            byte countToRead = 0x10;
            byte loOffset;
            byte hiOffset;

            List <byte> areaBytes = new List <byte>();

            IpmiSharedFunc.SplitWord(offset, out loOffset, out hiOffset);

            ushort totalDataRead             = countToRead;
            ChassisFruReadRequest fruRequest =
                new ChassisFruReadRequest(loOffset, hiOffset, countToRead);

            ChassisFruReadResponse fruResponse = SendReceive <ChassisFruReadResponse>(deviceType, deviceId, (fruRequest));

            completionCode = fruResponse.CompletionCode;

            if (completionCode == (byte)CompletionCode.Success)
            {
                ushort dataSize = FruArea.AreaLength(fruResponse.DataReturned);
                totalDataRead = Math.Min(countToRead, dataSize);
                IpmiSharedFunc.AppendArrayToList(fruResponse.DataReturned, areaBytes, totalDataRead);
                offset += totalDataRead;
                int       pass      = 0;
                const int readLimit = 12;

                while (dataSize > totalDataRead && pass <= readLimit)
                {
                    IpmiSharedFunc.SplitWord(offset, out loOffset, out hiOffset);

                    if (!maxLenght)
                    {
                        countToRead = (byte)Math.Min(countToRead, dataSize - totalDataRead);
                    }
                    else
                    {
                        countToRead = (byte)Math.Min(byte.MaxValue, dataSize - totalDataRead);
                    }

                    fruRequest = new ChassisFruReadRequest(loOffset, hiOffset, countToRead);
                    // send request for more data
                    fruResponse    = SendReceive <ChassisFruReadResponse>(deviceType, deviceId, (fruRequest));
                    totalDataRead += countToRead;
                    offset        += countToRead;

                    completionCode = fruResponse.CompletionCode;

                    if (completionCode == 0x00)
                    {
                        IpmiSharedFunc.AppendArrayToList(fruResponse.DataReturned, areaBytes, countToRead);
                    }
                    else
                    {
                        break;
                    }

                    pass++;
                }

                if (pass > 12)
                {
                    completionCode = (byte)CompletionCode.InvalidIterationCount;
                }
            }

            return(areaBytes.ToArray());
        }