ホームページ バックエンド開発 PHPチュートリアル 可変長バイトコードアルゴリズム

可変長バイトコードアルゴリズム

Jul 29, 2016 am 08:58 AM
array bytes

最近「大規模WEBサービス開発技術」という本を読んでいました。この本では、データを圧縮してディスク IO を削減するための「可変長バイトコード アルゴリズム」アルゴリズムについて言及しています。
可変長バイトコードアルゴリズム:
バイトの最上位ビット (下付き文字 7) はフラグ ビットとしてのみ使用され、バイトの位置に応じて対応する 128 乗する必要があります

これは彼の疑似コードです
​​可変長バイトコードアルゴリズム

慎重に検討した後、それを PHP バージョンに翻訳しました:

<code><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><?php function codeNumber<span>(<span>$n</span>)</span>{
        <span>$bytes</span> = [];
        while <span>(true)</span>{
            array_unshift<span>(<span>$bytes</span>, bcmod<span>(<span>$n</span>, <span>128</span>)</span>)</span>;
            if<span>(<span>$n</span> 128</span>)</span>{
                break;
            }else{
                <span>$n</span> = intval<span>(<span>$n</span>/<span>128</span>)</span>;
            }
        }
        <span>$bytes</span>[count<span>(<span>$bytes</span>)</span> - <span>1</span>] += <span>128</span>;
        return <span>$bytes</span>;
    }

    function encode<span>(<span>$numbers</span>)</span>{
        <span>$bytestream</span> = [];
        foreach <span>(<span>$numbers</span> as <span>$n</span>)</span>{
            <span>$bytestream</span> = array_merge<span>(<span>$bytestream</span>, codeNumber<span>(<span>$n</span>)</span>)</span>;
        }
        return <span>$bytestream</span>;
    }

    function decode<span>(<span>$bytestream</span>)</span>{
        <span>$numbers</span> = [];
        <span>$n</span> = <span>0</span>;
        for <span>(<span>$i</span> = <span>0</span>; <span>$i</span> (<span>$bytestream</span>)</span>; <span>$i</span>++)</span>{
            if<span>(<span>$bytestream</span>[<span>$i</span>] 128</span>)</span>{
                <span>$n</span> = <span>128</span> * <span>$n</span> + <span>$bytestream</span>[<span>$i</span>];
            }else{
                <span>$n</span> = <span>128</span> * <span>$n</span> + <span>(<span>$bytestream</span>[<span>$i</span>] - <span>128</span>)</span>;
                array_push<span>(<span>$numbers</span>, <span>$n</span>)</span>;
                <span>$n</span> = <span>0</span>;
            }
        }
        return <span>$numbers</span>;
    }
    <span>$a</span> = encode<span>([<span>5</span>, <span>130</span>, <span>288</span>])</span>;
    var_dump<span>(<span>$a</span>)</span>;
    var_dump<span>(decode<span>(<span>$a</span>)</span>)</span>;

打印出来的内容是:
array<span>(<span>5</span>)</span> { [<span>0</span>]=> int<span>(<span>133</span>)</span> [<span>1</span>]=> string<span>(<span>1</span>)</span><span>"1"</span> [<span>2</span>]=> int<span>(<span>130</span>)</span> [<span>3</span>]=> string<span>(<span>1</span>)</span><span>"2"</span> [<span>4</span>]=> int<span>(<span>160</span>)</span> }
array<span>(<span>3</span>)</span> { [<span>0</span>]=> int<span>(<span>5</span>)</span> [<span>1</span>]=> int<span>(<span>130</span>)</span> [<span>2</span>]=> int<span>(<span>288</span>)</span> }

    //写二进制
    <span>$h</span> = fopen<span>(<span>'ejz3.txt'</span>, <span>'wb'</span>)</span>;
    foreach <span>(<span>$a</span> as <span>$k</span> => <span>$v</span>)</span>
    {
      <span>$str3</span> =  pack<span>(<span>'H*'</span>, sprintf<span>(<span>"%02x"</span>, <span>$v</span>)</span>)</span>;
      fwrite<span>(<span>$h</span>,  <span>$str3</span>)</span>;
    }
    fclose<span>(<span>$h</span>)</span>;

    //读二进制
    <span>$str2</span> = file_get_contents<span>(<span>'ejz3.txt'</span>)</span>;
    <span>$str2</span> = unpack<span>(<span>"H*"</span>, <span>$str2</span>)</span>;
    <span>$value</span> = str_split<span>(<span>$str2</span>[<span>1</span>], <span>2</span>)</span>;
    foreach <span>(<span>$value</span> as <span>$k</span> => <span>$v</span>)</span>
    {
      <span>$value</span>[<span>$k</span>] = base_convert<span>(<span>$v</span>, <span>16</span>, <span>10</span>)</span>;
    }
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
ログイン後にコピー
').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });

上記では、可変長バイトコード アルゴリズムをその側面も含めて紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

HWID V 2.2 の手動アクティベーション方法とチュートリアル HWID V 2.2 の手動アクティベーション方法とチュートリアル Oct 20, 2023 pm 07:17 PM

これは手動アクティベーションを実行したいユーザー向けです。これを行うためのツールに関するサポートが必要な場合は、ここを確認してください。手動アクティベーションプロセスは 2 つの部分に分けることができます。 1- 既製のバッチ ファイルから、インターネットが有効になっていることを確認します。管理者として Windows Powershell を開き、次のように入力してコマンドを指定順に一覧表示します。キーを入力します (上記のリストのキーに置き換えます) 次のコマンドを使用します &lt;key&gt;slmgr/ipk&lt;key&gt; ここからユニバーサル チケットをダウンロードし、ダウンロードしたファイルを解凍します。次に、Powershell に次のコードを入力します (Get-ItemProper

C# の Array.Sort 関数を使用して配列を並べ替える C# の Array.Sort 関数を使用して配列を並べ替える Nov 18, 2023 am 10:37 AM

タイトル: Array.Sort 関数を使用して C# で配列を並べ替える例 本文: C# では、配列は一般的に使用されるデータ構造であり、多くの場合、配列を並べ替える必要があります。 C# には Array クラスが用意されており、このクラスには配列を簡単に並べ替えるための Sort メソッドがあります。この記事では、C# で Array.Sort 関数を使用して配列を並べ替える方法を示し、具体的なコード例を示します。まず、Array.Sort 関数の基本的な使用法を理解する必要があります。 Array.So

golangの「unknown: bytes.Split」エラーを解決するにはどうすればよいですか? golangの「unknown: bytes.Split」エラーを解決するにはどうすればよいですか? Jun 25, 2023 pm 02:02 PM

Go 言語の bytes パッケージはバイト型を操作するためのパッケージであり、Split() メソッドなどの便利なメソッドが多数含まれています。ただし、Split() メソッドを使用すると、「未定義: bytes.Split」エラーが発生する可能性があります。このエラーは通常、Go バージョンに互換性がないこと、または必要な依存ライブラリが不足していることが原因で発生します。この記事では、このエラーを解決するいくつかの方法を紹介します。方法 1: 次のように Go バージョンをアップグレードします。

PHPのarray_merge_recursive()関数を使用するシンプルで明確な方法 PHPのarray_merge_recursive()関数を使用するシンプルで明確な方法 Jun 27, 2023 pm 01:48 PM

PHP でプログラミングする場合、多くの場合、配列をマージする必要があります。 PHP には、配列のマージを完了するための array_merge() 関数が用意されていますが、配列内に同じキーが存在する場合、この関数は元の値を上書きします。この問題を解決するために、PHP は配列をマージして同じキーの値を保持できる array_merge_recursive() 関数を言語で提供し、プログラム設計をより柔軟にします。配列マージ

PHP で array_combine 関数を使用して 2 つの配列を結合して連想配列にする方法 PHP で array_combine 関数を使用して 2 つの配列を結合して連想配列にする方法 Jun 26, 2023 pm 01:41 PM

PHP には、配列操作をより便利かつ高速にする強力な配列関数が多数あります。 2 つの配列を結合して連想配列にする必要がある場合、PHP の array_combine 関数を使用してこの操作を実行できます。この関数は、実際には、ある配列のキーを別の配列の値として新しい連想配列に結合するために使用されます。次に、PHP の array_combine 関数を使用して 2 つの配列を結合して連想配列にする方法を説明します。 array_comb について学ぶ

PHPのarray_fill()関数の使い方の詳しい説明 PHPのarray_fill()関数の使い方の詳しい説明 Jun 27, 2023 am 08:42 AM

PHP プログラミングにおいて、配列は大量のデータを簡単に処理できる非常に重要なデータ構造です。 PHP は配列関連の関数を多数提供しており、array_fill() はその 1 つです。この記事では、array_fill() 関数の使い方と実際の応用におけるヒントを詳しく紹介します。 1. array_fill() 関数の概要 array_fill() 関数の機能は、同じ値で構成される指定された長さの配列を作成することです。具体的には、この関数の構文は次のとおりです。

PHP の array_change_key_case() 関数の使用方法の概要 PHP の array_change_key_case() 関数の使用方法の概要 Jun 27, 2023 am 10:43 AM

PHP プログラミングでは、配列は頻繁に使用されるデータ型です。 array_change_key_case() 関数など、多数の配列操作関数もあります。この関数は、配列内のキー名の大文字と小文字を変換して、データ処理を容易にすることができます。この記事では、PHP での array_change_key_case() 関数の使用方法を紹介します。 1. 関数の構文とパラメータ array_change_ke

Java での ArrayIndexOutOfBoundsException の一般的な原因は何ですか? Java での ArrayIndexOutOfBoundsException の一般的な原因は何ですか? Jun 24, 2023 pm 10:39 PM

Java は、さまざまな開発分野で広く使用されている非常に強力なプログラミング言語です。ただし、Java プログラミング中に、開発者は ArrayIndexOutOfBoundsException 例外に遭遇することがよくあります。では、この異常の一般的な原因は何でしょうか? ArrayIndexOutOfBoundsException は、Java の一般的なランタイム例外です。これは、データにアクセスするときに、配列の添字が配列の範囲を超えていることを意味します。一般的な理由には次のようなものがあります。

See all articles