二進位安全(binary safe)是什麼意思?

譬如,redis說自己的協議(RESP)是二進位安全的,怎麼理解?

稍加舉例會更好,謝謝。


知乎上貌似沒有這個問題的現成答案,我看了下wikipedia,試著舉個例子,

c中的strlen函數就不算是binary safe的,因為它依賴於特殊的字元來判斷字元串是否結束,所以對於字元串str = "1234123"來說,

strlen(str)=4

而在php中,strlen函數是binary safe的,因為它不會對任何字元(包括)進行特殊解釋,所以在php中,

strlen(str)=8

所以,我理解的二進位安全的意思是:只關心二進位化的字元串,不關心具體格式.只會嚴格的按照二進位的數據存取。不會妄圖已某種特殊格式解析數據。


redis中SDS的實現保證了redis保存的數據是二進位安全的.

struct sdshdr {
int len;
int free;
char buf[];
};

它並不像C語言那樣,使用作為判定一個字元串的結尾,而是使用了獨立的len,這樣可以保證即使存儲的數據中有這樣的字元,它也是可以支持讀取的.


----- 我是搬運工 -----

二進位安全 - 森林之子

  php中有很多函數都說明是二進位安全的,那麼什麼是二進位安全的呢?

  在網上搜索了一下,有一種說法是:

  【TechTarget中國原創】二進位安全功能(binary-
safe
function)是指在一個二進位文件上所執行的不更改文件內容的功能或者操作。這能夠保證文件不會因為某些操作而遭到損壞。二進位數據是按照一串0和
1的形式編碼的。而絕大多數的程序會給某些特殊的比特串賦予不同的格式代碼,所以當用戶使用一個程序讀取一個二進位文件時,該文件會被按照這個程序的規則
進行解釋。如果這個程序所使用的格式編碼和文件被寫入的格式編碼一致,那麼這個文件可以被正常讀取,否則該文件的格式代碼之中會被附加一些無意義的符號,
也可能會導致文件損壞。如果最嚴重的情況發生,這樣的操作會因為損壞導致你的數據永久丟失。所以你應該將重要的文件保存在只讀性的存儲介質上,例如光碟。

  還有人說是此乃密碼學範疇——二進位安全是指,在傳輸數據時,保證二進位數據的信息安全,也就是不被篡改、破譯等,如果被攻擊,能夠及時檢測出來。 二進位安全包含了密碼學的一些東西,比如加解密、簽名等。

  但是個人直覺是關於數據存取的。

  在維基百科上搜索了一下:

Binary-safe is a computer programming term mainly used in connection with string manipulating functions.
A binary-safe function is essentially one that treats its input as a
raw stream of data without any specific format. It should thus work with
all 256 possible values that a character can take (assuming 8-bit characters).

  二進位安全是一種主要用於字元串操作函數相關的計算機編程術語。一個二進位安全功能(函數),其本質上將操作輸入作為原始的、無任何特殊格式意義的數據流。其在操作上應包含一個字元所能有的256種可能的值(假設為8為字元)。

  那麼什麼是特殊格式呢?

  Special characters:Most functions are not binary safe when using
any special or markup characters, such as escape codes or those that
expect null-terminated strings. A possible exception would be a function
whose explicit purpose is to search for a certain character in a binary
string.

  大多數的函數當其使用任何特別的安全或標記字元,如轉義碼,還是那些期望 null 結尾的字元串,不是二進位安全的。一個可能的例外將其明確的目的是要搜索的二進位字元串中的某些字元的函數。

  數據格式化:


 Data format

  Binary safe functions are required when working with data of
unknown format (otherwise the format would not be preserved) such as
arbitrary files, encrypted data, and the like. The length of the data
must be known by the function in order to operate on the entirety of the
data.

  在對未知格式的數據(儘管此格式無需保存),例如隨意的文件、加密數據及類似情況時,二進位安全功能是必須的。數據長度須知以便函數操作整體數據。


機器位元組存放有高位在前跟低位在前2種,2進位安全就是這2種機器都安全。數據格式是字元串的是2進位安全的,是整形的要處理過才行


sds.h/sds.c

struct sdshdr {
int len;
int free;
char buf[];
};

因為有了對字元串長度定義len, 所以在處理字元串時候不會以零值位元組()為字元串結尾標誌.

二進位安全就是輸入任何位元組都能正確處理, 即使包含零值位元組.


redis內部保存的字元串數據結構是自己實現的,並不是沿用c語言的字元串數據結構。c語言的字元串默認是以結尾的,也就是說你保存的字元串內存在,c語言自會識別前面的數據,後面的就會被忽略掉,所以說是不安全的。而redis內部雖然也是以標示一個字元串的結束,但是該字元串的指針內還保存了len和free兩個屬性,len表示該字元串的實際內容所佔長度,free表示分配給該字元串的全部空間-字元串實際內容長度,也就是free表示該字元串的空閑空間長度,所以你對該字元串取值時是通過len屬性判斷實際內容的長度,然後取的值。拼接字元串時是追加到free空間內中的。所以redis對字元串的求長度和更新內容等操作比c語言要快很多,因為求長度只需要返回該字元串的len屬性值,c語言想要遍歷整個字元串才會知道長度。拼接字元串「一般」也不需要在重新分配空間,拼接的字元串直接放在free內存中就可以了。


【二進位安全】:一個二進位安全功能(函數)是指在一個二進位文件上所執行的不更改文件內容的功能或者操作,其本質上將操作輸入作為原始的、無任何特殊格式意義的數據流。

【Redis?String二進位安全】:

  • String類型是二進位安全的,可以把圖片和視頻文件保存在String中。
  • 為了提高網站運行速度,可以使用String類型緩存一些靜態文件,如圖片文件、CSS文件等。

struct sdshdr {

int len;//記錄buf數組大小

int free;//記錄buf數組還有多少可用空間

char buf[];//字元串實體,保存字元串的內容

};

  • 因為有了對字元串長度定義len, 所以在處理字元串時候不會以零值位元組()為字元串結尾標誌.
  • 二進位安全就是輸入任何位元組都能正確處理, 即使包含零值位元組.


推薦閱讀:

【留學百科】在國外丟了護照該怎麼辦?
「受害有罪」與「安全建議」的界限在哪裡?
誰敢動我的電腦?Selfie App for Mac
超市門禁系統是如何工作的?

TAG:編程 | Redis | 安全 |