天天看點

7BIT壓縮編碼長度計算方法(C程式設計實作)

【小蝸牛發飙之作】

大家都知道,ASCII(不包括擴充ASCII)的最高位是0,是以,我們可以利用這一空位來存儲資料,“7BIT壓縮編碼”就是這麼做的。關于7BIT壓縮編碼的詳細算法,可以在網上找到(Simple)。這裡,我說一下自己的一種關于計算7BIT編碼長度的C語言實作方法。(應該有更好的方法啦~)

1。如果給出已經7BIT編碼的字元串,在不解碼的情況下,計算出解碼後的長度,也就是源碼(ASCII)的長度。

pSrc -- 已經編碼的字元串位址

nSrc -- 通過函數strlen(pSrc)計算出來的長度

nLength -- 原編碼的長度(就是我們想知道的結果)

if (nSrc%7 == 0)

{

    if (*(pSrc+nSrc-1) >> 1)

        nLength = (nSrc/7)*8;

    else

        nLength = (nSrc/7)*8 - 1;

}

else

    if (*(pSrc+nSrc-1) >> (8-nSrc%7))

        nLength = (nSrc/7)*8 + nSrc%7 + 1;

        nLength = (nSrc/7)*8 + nSrc%7;

解釋:

    第一個判斷編碼後的長度是不是7的倍數,我們都知道,7BIT壓縮編碼可以将8位元組ASCII壓縮成7位元組。如果編碼後的長度恰好是7的倍數,那麼就“很可能"源碼是8的倍數長度。這裡隻能說是“很可能”,因為 8*n-1 個ASCII編碼後也會占用 7*n 個位元組(也有可能是 7*n-1 位元組)。也就是說,160個ASCII編碼後為140位元組,159個ASCII編碼後也為140位元組(或者139位元組),那麼現在我們知道編碼後是140位元組,原編碼ASCII到底是160個,還是159個呢?

    if (*(pSrc+nSrc-1) >> 1) 做出了判斷,如果結果為真,那麼就是 8*n 個原編碼,如果為假,那麼就是 8*n-1 個原編碼。這裡,相信大家稍微思考一下就明白了;)嘻嘻,有不明白的,email問我啦~

    如果編碼後的長度,不是7的倍數,那麼對最後一位的移位判斷稍微複雜一些,道理是和上面一樣的,隻是移位的位數不一樣而已。計算長度的時候,先取出8位ASCII的整數倍(nSrc/7)*8,然後再取餘數nSrc%7,然後根據對最後一位的移位判斷結果,判斷到底是否還得加一位。(這是為什麼呢?為什麼不是和上面7的整數被時的減一位呢?哈哈~思考一下就知道了)

2。如果給出原ASCII字元串,在不編碼的情況下,計算出7BIT編碼後的長度。

pSrc -- 源ASCII字元串位址

nLength -- 7BIT編碼後的長度(就是我們想知道的結果)

if (nSrc%8 == 0)

    nLength = (nSrc/8)*7;

    if (*(pSrc+nSrc-1) >> nSrc%8-1)

        nLength = (nSrc/8)*7 + ((nSrc%8)*7)/8 + 1;

        nLength = (nSrc/8)*7 + ((nSrc%8)*7)/8;

    如果長度是8的整數倍,那非常簡單,如果不是呢,那麼又得對最後一位進行移位判斷了,所移位的位數為 nSrc%8-1 位,如果移位後,還“剩”資料,那麼就得多加一位了:)

好了,就說到這裡,如果有什麼不明白,或者發現我有不對的地方,或者有更好的計算方法,可以一起讨論哦!

順便提一下,7BIT編碼在發送短信時,如果短信内容都是ASCII,那麼将會采用7BIT壓縮編碼,将160個ASCII壓縮為140位元組進行傳輸。:)

------------------------------------------------------------------------------------------

趙小蝸牛

QQ: 755721501

E-mail: [email][email protected][/email]

在不斷奉獻中謀求生存發展、打造自己的優秀品質,用人性最本質最動人的一面“營銷”自己!

繼續閱讀