2017-08-28 4 views
2

私はJavaScriptからAS3に関数を変換しています。私はUint8ArrayByteArrayの間で呼び出しをマップしようとしていますが、いくつかの呼び出しが異なっていることがわかりました。 AS3で見つかっていないJavaScriptでのコールのAS3 ByteArrayでこれらのJavaScript関数の同等の呼び出しは何ですか?

var data = new Uint8Array() // Javascript 
var bytearray = new ByteArray(); // AS3 

一覧:

readUnicodeString() 
readString() 
readLongLong() 
read() 
tell() 

更新:
著者はUint8Arrayを使用してもUint8Arrayがサポートされていないフォールバッククラスを作成しているように見えます。私は何が起こっているのか把握できるときにこの質問を更新する必要があります。

アップデート2:
のでUint8ArrayがUint8Arrayがラッパークラスに渡されていること、その後に渡され:

Image = function (data) { 
    this.file = new File(data); 
    ... 
} 

var image = new Image(new Uint8Array(buffer)); 

早く...

File.prototype.readString = function(length) { 
    return String.fromCharCode.apply(null, this.read(length)).replace(/\u0000/g, ""); 
}; 

File.prototype.readUnicodeString = function(length) { 
    if (length == null) { 
     length = null; 
    } 
    length || (length = this.readInt()); 
    return iconv.decode(new Buffer(this.read(length * 2)), 'utf-16be').replace(/\u0000/g, ""); 
}; 

File.prototype.read = function(length) { 
    var i, j, ref, results; 
    results = []; 
    for (i = j = 0, ref = length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { 
     results.push(this.data[this.pos++]); 
    } 
    return results; 
}; 

を今すぐ質問がありますわずかに異なる。

アップデート3:

関連postのいくつかの詳細。ここに私のAS3変換しようとすると、次のとおりです。

public var useJSCalls:Boolean = true; 

    public function read(length):Array { 
     var i:int; 
     var j:int; 
     var ref; 
     var results:Array; 

     results = []; 
     var cur:int = file.position; 
     //var val = file.readUTFBytes(length); 
     //file.position = cur; 

     for (i = j = 0, ref = length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { 
      results.push(file.readUnsignedByte()); 
      //results.push(file.readByte()); 
      //results.push(file.readByte()); 
      //results.push(file.position++); 
      //results.push(data[position++]); 
     } 


     return results; 
    } 

    public function readString(length:int = -1):String { 
     if (useJSCalls) { 
      var val = read(length); 
      val = String.fromCharCode(val); 
      //val = String.fromCharCode(val).replace(/\u0000/g, ""); 
      return val; 
     } 

     if (length==-1) { 
      length = 1; 
     } 

     //var value = file.readMultiByte(length, "utf-8"); 
     var value = file.readMultiByte(length, "utf-8"); 

     return value; 
    } 

    public function readUnicodeString(length:int = -1):String { 
     var currentPosition:uint = file.position; 

     if (useJSCalls) { 
      if (length == -1) { 
       length = file.readInt(); 
      } 

      //return iconv.decode(new Buffer(this.read(length * 2)), 'utf-16be').replace(/\u0000/g, ""); 
      var array = read(length * 2); 
      var value = String.fromCharCode(array); 
      value = value.replace(/\u0000/g, ""); 
      var newPosition:uint = file.position; 
      file.position = currentPosition; 

      var value2 = file.readMultiByte(length, "utf-8"); 

      //value = file.readUTFBytes(int(length)); 
      file.position = newPosition; 

      return value; 
     } 

     return value; 
     /* 
     if (length==-1) { 
      return file.readInt() + ""; 
     } 

     return file.readUTFBytes(length); 
     */ 
    } 
+0

私は答えているうちに、これらの方法が何を返すと予想されるか説明してください。 – Organis

+0

質問をさらに詳細に更新しました。 –

+0

** read **メソッドは何を理解していますか?作者が複雑なものを作成したいと思ったのですが、中途半端に放棄したので、実際に** Math.abs(length)**バイトを通常の** Array **に読み込むだけです。 – Organis

答えて

1

as3 doc of ByteArray

readUnicodeString()readString()をチェックアウトがreadUTFBytes()

する必要があります私はAS3はLongIntegersを持っていると思ういけない、しかしreadDouble()は、私の知る限りでは、そのために働く必要があります。

+0

私は何かを発見しました。著者は、JavaScriptのバッファを扱うためのクラスを作成しました(拡張されていません)。それはすべてのカスタムかもしれません。だから私はこれらのメソッドがUint8Arrayの一部であるとは言えません。それは私が彼らに関する情報を見つけることができなかった理由かもしれません。これらは変換に役立ちます。このクラスがUint8Arrayに関連していない場合、私は質問を取り消すことがあります。 –

+0

著者は古いブラウザの代替クラスを作成したようです。私はどのメソッドがUint8Bufferの一部であり、どのメソッドがカスタムであるかわかりません。しかし、この情報は有益であり、十分に進むことができます。 –

2

//おそらく、非UTF(おそらくASCII)文字列を読み込みをreadString

function readUnicodeString(source:ByteArray, length:* = null):String 
{ 
    if (isNaN(length)) length = source.readUnsignedInt(); 
    else if (length < 1) length = source.readUnsignedInt(); 

    return source.readMultiByte(length, "utf-16be"); 
} 

readUnicodeString。

function readString(source:ByteArray, length:uint):String 
{ 
    return source.readMultiByte(length, "ascii"); 
} 

readLongLong

AS3で2つの整数型、INTUINT、4バイトの両方のでprobalyが

function readLongLong(source:ByteArray):Number 
{ 
    var result:Number = 0; 

    result += source.readUnsignedInt(); 
    result += source.readUnsignedInt() << 32; 

    return result; 
} 

リードのようなものであろうがあります

//元のコードは見た目よりも単純なものだとはまだ思っています。

function read(source:ByteArray, length:int):void 
{ 
    var result:Array = new Array; 

    for (var i:int = Math.abs(length); i > 0; i--) 
     result.push(source.readUnsignedByte()); 

    return result; 
} 

より多くの情報が必要

を教えてください。

+0

私は何かを発見しました。著者は、JavaScriptのバッファを扱うためのクラスを作成しました(拡張されていません)。それはすべてのカスタムかもしれません。だから私はこれらのメソッドがUint8Arrayの一部であるとは言えません。それは私が彼らに関する情報を見つけることができなかった理由かもしれません。これらは変換に役立ちます。このクラスがUint8Arrayに関連していない場合、私は質問を取り消すことがあります。 –

+0

著者は古いブラウザの代替クラスを作成したようです。私はどのメソッドがUint8Bufferの一部であり、どのメソッドがカスタムであるかわかりません。しかし、この情報は有益であり、十分に進むことができます。それは彼がUint8Arrayを渡しているように見えます。 –

+0

@ 1.21ギガワットこれは、Uint8Arrayの公式文書があなたが言及した方法について何も持っていないので私を混乱させるものです。 – Organis

関連する問題