/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震动代码解读
  2. Android——SpannableString上标,下标垂直对齐
  3. Android的listview、gridview 笔记
  4. Android的listview、gridview 笔记
  5. android sqlist中游标下标越界问题解决方案
  6. Android中的ThreadLocal源码解析
  7. Android中ListView.getCount()与ListView.getChildCount()区别和
  8. Android中OnScrollListener的详解(Listview分批加载用到)
  9. Android震动代码解读

随机推荐

  1. Android(安卓)开发第四天
  2. Firebase Crashlytics Sdk接入流程(Androi
  3. Android(安卓)在低版本sdk中没有getSuppo
  4. Android—网络编程
  5. RichTextUtil Android(安卓)文字高亮可点
  6. android使用豆瓣API出现500错误及解决方
  7. android 耳机插入检测
  8. 解决工程导入出现the currently displaye
  9. appium简明教程(7)——Desired Capabilitie
  10. android 项目 local_Test_exam 代码分享