ベースの深さ(4)Buffer、トランスコード

6790 ワード

Buffer
    前にいくつかのブザー類について言及しましたが、当時はあまり明確ではありませんでした.今回の機会について深く検討してみました.このものはいつ、どのように使われていますか?昨日友達と話しました.彼は私のブログの内容が長すぎると言いました.細かいですが、確かにちょっと深いです.そして、この記事はできるだけ多くの共同討論を行います.単一の文章の内容の多すぎる問題を減らします.  ここに来たことを思い出します.この二つのブログは全部原生モジュールfsを深く掘り下げています.もしファイルを操作すれば、注意深い子供が壊れても発見されます.fsモジュールの勉強にはまだ二つの章があります.この二つの仕事が終わったらhttpモジュールの勉強を始めます.今のプロジェクトの中で一部httpモジュールの機能があります.いいです.
      前の文章はデータファイルの操作をめぐって、nodeの中でどのようにファイルを操作しているかを検討しましたが、javascriptの中には文字列タイプしかなく、バイナリはサポートされていません.(ファイルの操作はすべてバイナリタイプです.これはファイルを読み込む時、なぜファイルの種類を区別しないのかという問題を解決しました.どんなファイルでもtxt、phpなどの内容はバイナリデータとして処理します.個人的な理解は公式解釈を代表しません.)奪ったnodeエンジニア達はきっとこのようなlowの問題を我慢できません.だから、バfferが誕生しました.バfferは一つの種類です.もっと正確にはキャッシュエリアです.メモリの中の役割はバイナリで言った領域を単独に保存します.nodejsでバfferはnodeと一緒に発表したコアバンクです.彼はV 8メモリ以外の元のメモリの中に存在します.このメモリのサイズは官職です.四角文書にも説明があります.
      現在、V 8エンジンは標準の32ビットシステム512 MBメモリの制限があります.64ビットシステムで1.4 gbです.限界は設定を上げることができます.最大~1024(〜1 GB)(32位)と4096(~4 GB)(64位)になりますが、単一プロセスをいくつかの労働者に分けてメモリの制限に命中することをお勧めします.
      しかし、Bufferは回収の方法で有効期限を設定したら、本当に難しいです.GCに回収されます.関連記事はここでは貼りません.この方面に関する文章は本当に少なすぎます.これを掘る人がいないようですか?それとも掘る価値がありませんか?
      バfferクラスの作成は、作成配列と類似しています.
var b=new buffer(10); //    10     

var b=new buffer([1,2,3])//          

var b=new buffer("   ","utf-8")//                 
buffer.write
     buf.write(string、offset、length、encoding)、bufferのパラメータを書き込み、stringは書き込みが必要な文字列、offsetキャッシュエリアからのインデックス値、length書き込み長(もちろんキャッシュエリアがいっぱいになったら一部を書き込むしかないです)、encoding符号化方式はUTF-8を黙認します.
     李さんです
buf = new Buffer(256);
len = buf.write("www.w3cschool.cn");
 
console.log("      : "+  len);
このキャッシュ方式は少しredisに似ていますが、有効期限とか何かがありません.フォーマットも大きく違っています.このキャッシュエリアに書き込むのはtxtテキストです.なんでも一行の中でずっと書いていますが、どうやって指定された内容を見つけますか?
     bufffer.toString
     low比だと思いますか?人もパラメータがあるということを忘れないでください.(encoding、start、end)あなたはどの位置に書いていますか?直接取ってきます.例を見てください.  
buf = new Buffer(26);
for (var i = 0 ; i < 26 ; i++) {
  buf[i] = i + 97;
}
 
console.log( buf.toString('ascii'));       //   : abcdefghijklmnopqrstuvwxyz
console.log( buf.toString('ascii',0,5));   //   : abcde
console.log( buf.toString('utf8',0,5));    //   : abcde
console.log( buf.toString(undefined,0,5)); //    'utf8'   ,    : abcde
はい、他にもたくさんの灰常灰の簡単な方法があります.例えば、compreを比較したり、copyをコピーしたり、sliceをカットしたりします.一つ一つ紹介しません.ドキュメントを見てみたら、もう簡単にはできません.http://www.w3cschool.cn/nodejs/x1u41ith.html
     ここでは多くの変換方法を説明しますが、前にも述べましたが、実際にはブザーキャッシュエリアには大きさがあり、回収メカニズムがあります.大きさには制限があります.省点について、まず変換方法を紹介してください.     
     BufferのAPI文書を読むと、readXXX()writeXXX()から始まるAPIがより多く発見されます.具体的には以下の通りです.
  • buf.readUltle(offset,byteLength[,noAsssert])
  • buf.readUID ntBE(offset,byteLength[,noAsssert])
  • buf.readIntle(offset,byteLength[,noAsssert])
  • buf.readIntBE(offset,byteLength[,noAsssert])
  • buf.readUlt 8(offset[,noAssset])
  • buf.readUlt 16 LE(offset[,noAsssert])
  • buf.readUID nt 16 BE(offset[,noAssset])
  • buf.readUlt 32 LE(offset[,noAsssert])
  • buf.readUlt 32 BE(offset[,noAssset])
  • buf.readInt 8(offset[,noAssset])
  • buf.readInt 16 LE(offset[,noAssset])
  • buf.readInt 16 BE(offset[,noAssset])
  • buf.readInt 32 LE(offset[,noAssset])
  • buf.readInt 32 BE(offset[,noAssset])
  • buf.readFloatle(offset[,noAssset])
  • buf.readFloat BE(offset[,noAssset])
  • buf.readDouble
  • buf.readDouble BE(offset[,noAssset])
  • buf.write(string[,offset][,length]]
  • buf.writeUltle(value、offset、byteLength[、noAsssert])
  • buf.writeUID ntBE(value,offset,byteLength[noAsssert])
  • buf.writeIntle(value、offset、byteLength[noAsssert])
  • buf.writeIntBE(value、offset、byteLength[noAsssert])
  • buf.writeUlt 8(value,offset[,noAssset])
  • buf.writeUlt 16 LE(value,offset[,noAsssert])
  • buf.writeUID 16 BE(value,offset[,noAsssert])
  • buf.writeUID 32 LE(value,offset[,noAsssert])
  • buf.writeUID 32 BE(value,offset[,noAsssert])
  • buf.writeInt 8
  • buf.writeInt 16 LE(value,offset[,noAsssert])
  • buf.writeInt 16 BE(value,offset[,noAsssert])
  • buf.writeInt 32 LE(value,offset[,noAsssert])
  • buf.writeInt 32 BE(value,offset[,noAsssert])
  • buf.writeFloat LE
  • buf.writeFloat BE(value,offset[,noAsssert])
  • buf.writeDouble
  • buf.writeDouble BE(value,offset[,noAsssert])
  •     これらのAPIは、Node.jsでのデータ操作に極めて便利である.例えば、現在のタイムスタンプが1447656645380であるような整形値をファイルに格納する場合、1つの文字列として記憶する場合、11バイトの空間を占有し、2進メモリに変換する場合は6バイトの空間だけが必要である. 
    var buf = new Buffer(6);
     
    buf.writeUIntBE(1447656645380, 0, 6);
    // 
     
    buf.readUIntBE(0, 6);
    // 1447656645380
    この頃はもう一人の大神さんの一年前のブログから来ました.データを取り出す構造によって混乱されました.この問題を解決するためにわざわざモジュールを書いてきました.lei-protoは時間がありますので、転送ドアを拝みます.http://cnodejs.org/topic/56499568d28aa64101600fdc
    コーディング変換
       ここでは主に中国語を紹介します.私が接触している二つの第三方倉庫を紹介します.多くの人はいつも新しいものを使って未知の領域を探索しているよりも古いものを信じたいです.何千万人も使ったことがあります.無駄はありません.
         前はいつもtoStering()という方法を使っていましたが、node自身は中国語及びその他の多バイトコードに対してよくサポートされていません.第三者倉庫で調整する必要があります.ここでは主によく使うiconv-liteとencodingを紹介します.
         iconv-lite
         まず、iconv、iconv-lite、encodingを調べます.
         iconv:クラスUnixシステムにおける標準文字セット変換インターフェースであり、異なる文字セットコード間で変換するために用いられ、最初にHP-UXシステムに現れ、node-inconvの起源を説明した.
         iconv-lite:iconvの純js実現で、サポートされているコードはnode.jsの原生コードを含みます.utf 8、ucs 2、ascii、binary、base 64;同時に広く使われている単バイトコードをサポートします.Windows 125 x family、ISO-859 family、IBM/DOS codepages、Macitosh familly、KOImilly 35、オフィシャル.
     
         encoding:node-inconvとiconv-liteの再パッケージです.encodingはまずnode-inconvを呼び出します.node-inconvが解析できないなら、代わりの方案としてiconv-liteを呼び出します.iconv-liteの包装版に相当します.
         
         この二つの第三者倉庫は全部同じsup簡単npm install iconv-liteです. またはnpm install encoding
         
         使用方法をテストしました.他の人のコードを基本的に見れば、特別なものはないと分かります.全部元のtoStringの代わりに使う方法です.encodingは少し話してみます.まず、iconv-liteです.
    var iconv = require('iconv-lite');
      
    // Convert from an encoded buffer to js string.
    str = iconv.decode(buf, 'win1251');
      
    // Convert from js string to an encoded buffer.
    buf = iconv.encode("Sample input string", 'win1251');
      
    // Check if encoding is supported
    iconv.encodingExists("us-ascii")
    encodingは小さいボールを回る必要があります.encodingモジュールは一つの方法でconvert()を使用します. 
                 text:変換が必要なオブジェクトは、BufferまたはStringオブジェクトとすることができます.
                 変換後のコード.
                 from Charset:変換前のコードは、デフォルトはuft 8です.
                変換後の入力結果はBufferオブジェクトです.
     
    var encoding = require('encoding');
      
    var result = encoding.convert("ÕÄÖÜ", "Latin_1");
    console.log(result); //