Twisted Protocol操作二進位制資料

2021-08-29 22:16:17 字數 3409 閱讀 1378

今天寫了乙個twisted例程,很順利,twisted的確不錯。但是在除錯def datareceived(self,data):的時候,突然想到,如果data引數需要傳入二進位制資料怎麼辦,於是google一下,無果。後來想了一下,會不會像php一樣不管string和binary都當作字串處理?畢竟都是弱型別。

於是,就寫了兩段**,乙個服務端,乙個客戶端。他們的工作是,客戶端讀取乙個檔案的資料,然後傳送到伺服器端,伺服器端原樣返回,然後客戶端再把返回的資料存到另乙個裡面,看看,存入的對不對(由於沒有寫buffer,所以你要試驗的話,盡量找個小,否則,可能會存下半張),結果不出我所料,和php一樣string和binary不分的,就是客戶端傳送過去的是string服務端就當字串處理,如果發過去的是binary就當binary處理(python有個struct模組 專門處理二進位制資料,和php的pack、unpack是函式一樣的,連函式名都一樣,不知道誰抄誰的)

下面是server端**:

from twisted.internet import reactor, defer, protocol

from twisted.internet.protocol import protocol

class defe***ctory(protocol.serve***ctory):

def __init__(self):

self.deferred = defer.deferred();

class piper(protocol):

def connectionmade(self):

#self.factory.deferred.callback(self);

def datareceived(self,data):

self.transport.write(data);

#self.factory.deferred.callback((self, data));

def testcallback(data):

data[0].transport.write(data[1]);

#factory.deferred.callback

#this can only be run once.

#later calls to this or errback will raise twisted.internet.defer.alreadycallederror.

#so redefine this

data[0].factory.deferred=defer.deferred();

data[0].factory.deferred.addcallback(testcallback);

if __name__ == "__main__":

factory = defe***ctory();

factory.protocol = piper;

factory.deferred.addcallback(testcallback);

reactor.listentcp(8007,factory);

reactor.run();

然後是client端:

二進位制操作

關於二進位制操作很常見,很多筆試面試題中也有涉及,本篇主要圍繞二進位制翻轉,二進位制最高位判定和給定整數的二進位制輸出來 靈活使用二進位制的 操作。一 給定整數的二進位制翻轉 思路 可以考慮逐次翻轉得到最終的翻轉結果,具體做法,首先將所有二進位制位奇偶位逐個翻轉,然後以兩位為一對 作為整體 奇偶對逐...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

二進位制數反轉

1 使用了歸併排序的思路 最快 但是時間複雜度比歸併排序要小,每行 都相當於完成了一次歸併 include unsigned revbit unsigned x void main 2 把乙個32位整數按位反轉,即第1位轉到第32位,第2位轉到第31位,依次下去。一牛人寫的演算法如下 unsigne...