/frameworks/base/telephony/java/com/android/internal/telephony/cdma/BearerData.java

87    private static void encodeUserData(BearerData bData, BitwiseOutputStream outStream)688        throws BitwiseOutputStream.AccessException, CodingException689    {690        /*691         * TODO(cleanup): Do we really need to set userData.payload as692         * a side effect of encoding?  If not, we could avoid data693         * copies by passing outStream directly.694         */695        encodeUserDataPayload(bData.userData);696        bData.hasUserDataHeader = bData.userData.userDataHeader != null;697698        if (bData.userData.payload.length > SmsConstants.MAX_USER_DATA_BYTES) {699            throw new CodingException("encoded user data too large (" +700                                      bData.userData.payload.length +701                                      " > " + SmsConstants.MAX_USER_DATA_BYTES + " bytes)");702        }703704        /*705         * TODO(cleanup): figure out what the right answer is WRT paddingBits field706         *707         *   userData.paddingBits = (userData.payload.length * 8) - (userData.numFields * 7);708         *   userData.paddingBits = 0; // XXX this seems better, but why?709         *710         */711        int dataBits = (bData.userData.payload.length * 8) - bData.userData.paddingBits;712        int paramBits = dataBits + 13;713        if ((bData.userData.msgEncoding == UserData.ENCODING_IS91_EXTENDED_PROTOCOL) ||714            (bData.userData.msgEncoding == UserData.ENCODING_GSM_DCS)) {715            paramBits += 8;716        }717        int paramBytes = (paramBits / 8) + ((paramBits % 8) > 0 ? 1 : 0);718        int paddingBits = (paramBytes * 8) - paramBits;719        outStream.write(8, paramBytes);720        outStream.write(5, bData.userData.msgEncoding);721        if ((bData.userData.msgEncoding == UserData.ENCODING_IS91_EXTENDED_PROTOCOL) ||722            (bData.userData.msgEncoding == UserData.ENCODING_GSM_DCS)) {723            outStream.write(8, bData.userData.msgType);724        }725        outStream.write(8, bData.userData.numFields);726        outStream.writeByteArray(dataBits, bData.userData.payload);727        if (paddingBits > 0) outStream.write(paddingBits, 0);728    }
这个todo/*705         * TODO(cleanup): figure out what the right answer is WRT paddingBits field706         *707         *   userData.paddingBits = (userData.payload.length * 8) - (userData.numFields * 7);708         *   userData.paddingBits = 0; // XXX this seems better, but why?709         *710         */

解决方法是如下标红的行

 

private static void encodeUserDataPayload(UserData uData)630        throws CodingException631    {632        if ((uData.payloadStr == null) && (uData.msgEncoding != UserData.ENCODING_OCTET)) {633            Rlog.e(LOG_TAG, "user data with null payloadStr");634            uData.payloadStr = "";635        }636637        if (uData.userDataHeader != null) {638            encodeEmsUserDataPayload(uData);639            return;640        }641642        if (uData.msgEncodingSet) {643            if (uData.msgEncoding == UserData.ENCODING_OCTET) {644                if (uData.payload == null) {645                    Rlog.e(LOG_TAG, "user data with octet encoding but null payload");646                    uData.payload = new byte[0];647                    uData.numFields = 0;648                } else {649                    uData.numFields = uData.payload.length;650                }651            } else {652                if (uData.payloadStr == null) {653                    Rlog.e(LOG_TAG, "non-octet user data with null payloadStr");654                    uData.payloadStr = "";655                }656                if (uData.msgEncoding == UserData.ENCODING_GSM_7BIT_ALPHABET) {657                    Gsm7bitCodingResult gcr = encode7bitGsm(uData.payloadStr, 0, true);658                    uData.payload = gcr.data;659                    uData.numFields = gcr.septets;660                } else if (uData.msgEncoding == UserData.ENCODING_7BIT_ASCII) {661                    uData.payload = encode7bitAscii(uData.payloadStr, true);662                    uData.numFields = uData.payloadStr.length();663                } else if (uData.msgEncoding == UserData.ENCODING_UNICODE_16) {664                    uData.payload = encodeUtf16(uData.payloadStr);665                    uData.numFields = uData.payloadStr.length();666                } else if (uData.msgEncoding == UserData.ENCODING_SHIFT_JIS) {667                    uData.payload = encodeShiftJis(uData.payloadStr);668                    uData.numFields = uData.payload.length;669                } else {670                    throw new CodingException("unsupported user data encoding (" +671                                              uData.msgEncoding + ")");672                }673            }674        } else {               uData.numFields = uData.payloadStr.length();675            try {676                uData.payload = encode7bitAscii(uData.payloadStr, false);677                uData.msgEncoding = UserData.ENCODING_7BIT_ASCII;                   uData.paddingBits = (uData.payload.length * 8) - (uData.numFields * 7);678            } catch (CodingException ex) {679                uData.payload = encodeUtf16(uData.payloadStr);680                uData.msgEncoding = UserData.ENCODING_UNICODE_16;                   uData.paddingBits = 0;681            }682            //uData.numFields = uData.payloadStr.length();683            uData.msgEncodingSet = true;684        }685    }

更多相关文章

  1. Android——SpannableString上标,下标垂直对齐
  2. android sqlist中游标下标越界问题解决方案
  3. C语言中数组元素的下标下限是什么
  4. c语言中数组的下标从什么开始?
  5. 在c语言中,引用数组元素时,其数组下标的数据类型允许是什么?
  6. 在c语言中引用数组元素时,其数组下标的数据类型允许是什么
  7. (美团)巧用数组下标,轻轻松松找出所有元素
  8. php检查数组下标是否存在
  9. php如何以一个对象作为数组下标?

随机推荐

  1. 写给初学者Android(安卓)AIDL必看内容
  2. Android 使用RecyclerVeiw加载复杂布局
  3. Android访问中央气象台的天气预报API得到
  4. Android(安卓)FileProvider详细解析和踩
  5. android之自定义渐变颜色(二)
  6. Android NDK区分第一次起机-sqlite3 oper
  7. [下载]Android 手机十大必备软件
  8. android通过Base64往服务器上传图片和对
  9. 2017.03.12 Android卡顿分析
  10. Android 蓝牙模块