小程序使用protobuf上報(bào)嵌套數(shù)據(jù)

在和第三方對接時(shí)倦西,對方要求使用protobuf協(xié)議,實(shí)現(xiàn)數(shù)據(jù)序列化進(jìn)行傳輸旅急。協(xié)議文件使用了兩個(gè)逢勾,因?yàn)槭乔短最愋偷摹5亲罱K放棄了藐吮,因?yàn)樵谑褂弥Ц秾毜男〕绦蜷_發(fā)時(shí)溺拱,對方接收到的數(shù)據(jù)和我發(fā)給他的是不一樣的。
但是怎么說是成功了的谣辞。以下是看了很多文檔資料實(shí)踐做的總結(jié)迫摔。
github 項(xiàng)目 https://github.com/Zhang19910325/protoBufferForWechat 介紹了如何使用protobuf。以下是開發(fā)時(shí)遇到的問題和解決方法泥从。

  1. github 項(xiàng)目 https://github.com/Zhang19910325/protoBufferForWechat 句占,將其下載放進(jìn)小程序目錄下
  2. windows環(huán)境執(zhí)行以下命令
    npm install -g protobufjs
  3. awesome.proto 文件進(jìn)行處理 ( 處理為json )
    在控制臺執(zhí)行命令:pbjs -t json awesome.proto > awesome.json (確保是在同一個(gè)根目錄下)
    將生成的 協(xié)議.json 第一行添加 “ module.exports = ” 如:
module.exports = {
     "nested": {
           "UniversalReportRequest": {
              "fields": {
                     "awesomeField": {
                             "type": "隨便加的",
                             "id": 1           
                      }
                }
            },
           "'AdIdInfo'": {
                  "fields": {
                     "awesomeField": {
                             "type": "隨便加的",
                             "id": 1           
                      }
                }
            }
       }
};
  1. 序列化要做的事情
let protobuf = require('../../weichatPb/protobuf.js'); //引入protobuf模塊(下載的那個(gè)文件)
let UniversalReportRequest = require('../../awesome.js'); //加載awesome.proto對應(yīng)的js
//序列化要用到的
let AwesomeRootUni = protobuf.Root.fromJSON(UniversalReportRequest);
let LoginRequestInfo = AwesomeRootUni.lookupType('AdIdInfo');
let LoginRequestUni = AwesomeRootUni.lookupType('UniversalReportRequest');
  1. 先序列化內(nèi)嵌的數(shù)據(jù)
let adIdInfoAll = {
        creativeId: boftupAll.creative_id,
        taskId: boftupAll.task_id
};
//將adIdInfoAll序列化轉(zhuǎn)為二進(jìn)制
let messageInfo = LoginRequestInfo.create(adIdInfoAll);
let bufferInfo = LoginRequestInfo.encode(messageInfo).finish(); //內(nèi)嵌數(shù)序列化的結(jié)果
  1. 將序列化的數(shù)據(jù)塞進(jìn)最外層的數(shù)據(jù)后躯嫉,再次序列化
 let boftupXuyaode = {
        id: this.data.boftuId,
        timestamp: this.data.boftup.timestamp,
        adIdInfoAll:{
          bufferInfo,  //內(nèi)嵌數(shù)據(jù)序列化的結(jié)果
        }
},    
  1. boftupXuyaode序列化
let messageUni = LoginRequestUni.create(boftupXuyaode );// 將對象序列化成請求體實(shí)例
let bufferUni = LoginRequestUni.encode(messageUni).finish()
  1. 以上就是內(nèi)嵌的數(shù)據(jù)序列化辖众。最終得bufferUni就是所有序列化后得結(jié)果了。但是和敬,還沒結(jié)束凹炸。以上所打印出來得數(shù)據(jù)有的是大于127位的。而java中byte類型數(shù)據(jù)取值范圍為-128~127昼弟。所以還要在每次的序列化之后使用 JS Byte數(shù)據(jù)字轉(zhuǎn)字節(jié)(無符號轉(zhuǎn)有符號)
function unsigned2signed(unsigned) {
       var value = parseInt(unsigned, 10);
       if (value > 256)
              return value % 256;
              var temp = []; //10進(jìn)制轉(zhuǎn)換為2進(jìn)制字符串
               while (value > 0) {
                    if (value % 2 != 0) {
                        temp.push(1);
                    } else {
                        temp.push(0);
                    }
                    value = parseInt(value / 2);
               }
                //不足8位再前方做補(bǔ)0操作
                temp.reverse();
                while (temp.length < 8) {
                    temp.unshift(0)
                }
                temp = temp.join('');
                var signed = ''; //無符號轉(zhuǎn)有符號字節(jié) 取該二進(jìn)制字符串補(bǔ)碼即可
                if (temp.substr(0, 1) == 1) { //二進(jìn)制符號位等于1 則有符號
                    for (var i = 1; i < temp.length; i++) {
                        temp.substr(i, 1) == 1 ? signed += 0 : signed += 1;
                    }
                    return ('-' + (parseInt(signed, 2) + 1));
                } else {
                    for (var i = 0; i < temp.length; i++) {
                        signed += temp.substr(i, 1); //源碼輸出
                    }
                    return (parseInt(signed, 2));
        }
}
  1. 無符號轉(zhuǎn)有符號的時(shí)候要用循環(huán)便利一下~
var array = Array.from(bufferInfo)
let arrNumberString = [];
for(let i=0;i<array.length; i++){
       let unsignedString1 = Number(this.unsigned2signed(array[i]));
       arrNumberString.push(unsignedString)
}   //arrNumberString 最終 java 可以解析成功了啤它!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舱痘,隨后出現(xiàn)的幾起案子变骡,更是在濱河造成了極大的恐慌,老刑警劉巖芭逝,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塌碌,死亡現(xiàn)場離奇詭異,居然都是意外死亡旬盯,警方通過查閱死者的電腦和手機(jī)台妆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門翎猛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人接剩,你說我怎么就攤上這事切厘。” “怎么了懊缺?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵疫稿,是天一觀的道長。 經(jīng)常有香客問我鹃两,道長遗座,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任俊扳,我火速辦了婚禮途蒋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拣度。我一直安慰自己碎绎,他們只是感情好螃壤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布抗果。 她就那樣靜靜地躺著,像睡著了一般奸晴。 火紅的嫁衣襯著肌膚如雪冤馏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天寄啼,我揣著相機(jī)與錄音逮光,去河邊找鬼。 笑死墩划,一個(gè)胖子當(dāng)著我的面吹牛涕刚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乙帮,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼杜漠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了察净?” 一聲冷哼從身側(cè)響起驾茴,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氢卡,沒想到半個(gè)月后锈至,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡译秦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年峡捡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了击碗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棋返,死狀恐怖延都,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情睛竣,我是刑警寧澤晰房,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站射沟,受9級特大地震影響殊者,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜验夯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一猖吴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挥转,春花似錦海蔽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至借宵,卻和暖如春幌衣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背壤玫。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工豁护, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人欲间。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓楚里,卻偏偏與公主長得像,于是被迫代替她去往敵國和親猎贴。 傳聞我的和親對象是個(gè)殘疾皇子班缎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 本文轉(zhuǎn)自劉明的分享。原文 簡介 什么是 Google Protocol Buffer嘱能? 假如您在網(wǎng)上搜索吝梅,應(yīng)該會得...
    那樣風(fēng)采閱讀 1,583評論 0 1
  • 前言 之前一直忙于移動端日志SDK Trojan的開源工作,已十分穩(wěn)定地運(yùn)行在餓了么團(tuán)隊(duì)App中惹骂,集成了日志加密和...
    水木飛雪閱讀 24,633評論 16 96
  • 簡介 protoBuf是google 的一種數(shù)據(jù)交換的格式苏携,它獨(dú)立于語言,獨(dú)立于平臺对粪。google 提供了多種語言...
    ssochi閱讀 2,993評論 0 2
  • 喜歡簡單右冻。 因簡單装蓬,而純粹;因純粹纱扭,方得簡單牍帚。 生活簡單。沒有觥籌交錯的熱鬧乳蛾,迎來送往的繁瑣暗赶。日...
    山河遠(yuǎn)闊tang閱讀 287評論 1 3
  • 秋風(fēng)陣陣雨綿綿, 有人歡喜有人厭肃叶。 天象變化本自然蹂随, 心懷美好見藍(lán)天。
    可比克克閱讀 261評論 4 7