private Object decodePut(final IoBuffer buff, final String[] sa) {
                    this.assertCommand(sa[0], "put");
                    final int valueLen = Integer.parseInt(sa[3]);
                    if (buff.remaining() < valueLen) {
                        buff.reset();
                        return null;
                    }
                    else {
                        final byte[] data = new byte[valueLen];
                        buff.get(data);
                        switch (sa.length) {
                        case 6:
                            // old clients before 1.4.4
                            return new PutCommand(sa[1], Integer.parseInt(sa[2]), data, null, Integer.parseInt(sa[4]),
                                Integer.parseInt(sa[5]));
                        case 7:
                            // either transaction command or new clients since
                            // 1.4.4
                            String slot = sa[5];
                            char firstChar = slot.charAt(0);
                            if (Character.isDigit(firstChar) || '-' == firstChar) {
                                // slot is checksum.
                                int checkSum = Integer.parseInt(slot);
                                return new PutCommand(sa[1], Integer.parseInt(sa[2]), data, Integer.parseInt(sa[4]),
                                    checkSum, null, Integer.parseInt(sa[6]));
                            }
                            else {
                                // slot is transaction id.
                                return new PutCommand(sa[1], Integer.parseInt(sa[2]), data,
                                    this.getTransactionId(slot), Integer.parseInt(sa[4]), Integer.parseInt(sa[6]));
                            }
                        case 8:
                            // New clients since 1.4.4
                            // A transaction command
                            return new PutCommand(sa[1], Integer.parseInt(sa[2]), data, Integer.parseInt(sa[4]),
                                Integer.parseInt(sa[5]), this.getTransactionId(sa[6]), Integer.parseInt(sa[7]));
                        default:
                            throw new MetaCodecException("Invalid put command:" + StringUtils.join(sa));
                        }
                    }
                }
result code length opaque\r\n message

@param buff
@param sa
@return
metamorphosis-commons/src/main/java/com/taobao/metamorphosis/network/MetamorphosisWireFormatType.java