2010-10-25 112 views
3

我目前在noVNC中有一個python和C版本的wsproxy(WebSockets到普通TCP套接字代理)。我想用node.js創建一個wsproxy的版本。一個關鍵因素(以及我不僅僅使用現有節點WebSocket代碼的原因)是,除非WebSocket標準採用二進制編碼,否則wsproxy和瀏覽器/客戶端之間的所有流量都必須進行編碼(並且base64解碼/編碼是快速且容易的在瀏覽器中)。Base64在節點(node.js)中高效地從緩衝區解碼到緩衝區

緩衝區類型具有base64編碼支持,但這是從Buffer到字符串,反之亦然。 如何在兩個緩衝區之間進行base64編碼/解碼,而不必首先轉換爲字符串?

約束:

  • 直接緩衝到緩衝器(除非你能證明Buffer->與字符串>緩衝區一樣快)。
  • 由於節點具有內置的base64支持,我想使用它和而不是外部模塊
  • 就地編碼/解碼在一個緩衝區內是可以接受的。

Here是討論base64在節點中的支持,但是從我所看到的並不能回答我的問題。

+0

這不是唯一的問題,閃光後退變得可怕的慢?否則,二進制工作正常,雖然在協議中存在UTF-8編碼/解碼開銷,但這總是在那裏。無論如何,在複製和使用'toString()'在快速測試中速度慢150倍時,'buffer.copy'不適用編碼。您可能希望在節點上發出一個錯誤,以緩衝區複製指定編碼中的哪些副本。 – 2010-10-25 11:47:46

+0

由於WebSockets數據當前僅限於UTF-8(希望在將來的修訂中這會改變),代理服務器必須對原始套接字數據進行某種編碼。閃回回落增加了無法發送零字節的扭曲(技術上UTF-8是合法的)。將每個字節編碼爲UTF-8佔用了150%的空間(任何其他UTF-8編碼在Javascript中解碼速度太慢)。 Base64是133%,因此在空間和處理方面效率更高。 – kanaka 2010-10-25 14:39:14

回答

0

您應該可以使用流來完成此操作,但首先請仔細閱讀此blog about UTF-8 decoding,因爲您可能會遇到類似的問題。如果你不需要它,我並不是建議你進行UTF-8編碼/解碼,但是你要看看這段代碼如何處理單個字符如何分佈在由塊邊界分隔的多個字節上。

+0

爲了速度,我可能不夠清楚,我不想Javascript實現(代碼存在),而是本機Base64解碼例程。我已經有一種使用本地base64例程的方式,但它們首先遍歷一個字符串,我想擺脫這種情況。 – kanaka 2011-02-23 15:20:56

+0

如果您需要C++代碼,那麼爲什麼不採用現有的Base64編碼/解碼代碼並使用它來構建您的擴展。順便說一句,標籤不是很清楚,所以我刪除了一對夫婦,並添加了一對夫婦。這可能會給你更多的答案。 – 2011-02-24 04:59:07