有關使用HTTP協議傳輸二進位制檔案

2021-07-03 23:26:21 字數 1420 閱讀 5755

從第一次接觸http協議的時候,不知是怎麼回事,形成了這麼乙個錯誤的觀點,認為http協議是個純ascii字元協議。關於http傳輸ascii文字內容的過程相信大家都應該容易理解,因為http請求頭和響應頭都是以ascii文字方式傳輸的。而對於http傳輸二進位製流的相關細節,其實沒有我想象中的那麼複雜,以前學習pop3和smtp(這兩個都是郵件傳輸協議)的時候,知道他們都只能傳輸ascii文字,如果要在郵件中加入附件,如一張(檔案就是二進位制檔案)那就得先對檔案轉碼,即將郵件協議不能傳輸的二進位制資料流轉換成可被郵件協議傳輸的ascii資料流,其中用的最多的轉換就是base64編碼轉換。其實base64編碼轉換也同樣適合於http協議,只有你在轉換後將http響應頭中的transfer-encoding設定為base64,當然如果客服端瀏覽器不支援base64編碼那這種轉換也是徒勞的,不過幸好現在幾乎所有瀏覽器都支援base64(你能用瀏覽器檢視郵件中的附件就是證據)。

不過話又回來,既然http能夠直接支援二進位制的資料流傳輸,那我們又何必繞著彎子,走冤枉路呢?

下面我們就準備乙個例子,證明http中傳輸二進位制資料。

http協議是基於字元(ascii)的,當content-type項為text/xml,則內容是文字格式;當二進位制格式時,content-type項為image/gif,就是了。例如,瀏覽器請求一張的資料報資訊:

1、請求訊息:

2、響應訊息:

下面是二進位制的資料區

由上可知,http協議中content中可以是純二進位制的。

通常上的理解,http協議中請求、相應都是以ascii字元方式傳輸,如果要傳輸二進位制需要經過base64或mime等編碼(

因為http協議pop3、smtp郵件協議都是針對文字的,而ftp支援傳輸二進位制資料,即不需要經過編碼轉換成字元型資料)

如果直接使用http傳輸二進位制(不經過base64編碼),可能會造成一下問題:

1) 不知道傳輸位元組的具體長度,如傳輸的int型別,將int型別之間轉為char以後,丟失掉了長度的資訊,如數字1234567,本來只有4個位元組,但是轉化成文字的「1234567」是有7個位元組。在int型別的時候固然好辦,但是乙個陣列的時候,經過轉化以後,在轉化回來就很麻煩了。

2) 對於一些數字,二進位制傳輸server是沒法處理的。如int 1,二進位制資料是0x00000001,按位元組傳輸的時候,client能夠正常傳送,但是libevent收到以後,在拋給libevent_http層是,會把資料截斷,前兩位0x00是字串的停止符。

有關使用HTTP協議傳輸二進位制檔案

http協議是基於字元 ascii 的,當content type項為text xml,則內容是文字格式 當二進位制格式時,content type項為image gif,就是了。例如,瀏覽器請求一張的資料報資訊 1 請求訊息 2 響應訊息 下面是二進位制的資料區 由上可知,http協議中conte...

scp選擇二進位制 二進位制傳輸和文字傳輸的區別

ascii方式和binary方式的區別是回車換行的處理 binary方式不對資料執行任何處理 ascii方式將回車換行轉換為本機的回車字元,比如unix下是 n,windows下是 r n,mac下是 r ascii方式下會轉換檔案,不一樣的系統有不一樣的行完畢符,假設你的檔案就是unix下的文字檔...

二進位制有關問題

有1000瓶液體,味,外表完全 樣,其中 瓶是毒藥,有10 條警 警 喝過毒藥後兩 時後死亡。問,如何在兩個 時後確定 哪瓶是毒藥 解法 因為有1000瓶液體。10條警犬。分別給這1000瓶液體編號,為 1 10000 用二進位制表示 10位就夠了。因為2 10 1024 給這10只警犬分別編號 1...