这些 JavaScript 函数在 AS3 ByteArray 中的等效调用是啥?
Posted
技术标签:
【中文标题】这些 JavaScript 函数在 AS3 ByteArray 中的等效调用是啥?【英文标题】:What are the equivalent calls of these JavaScript functions in an AS3 ByteArray?这些 JavaScript 函数在 AS3 ByteArray 中的等效调用是什么? 【发布时间】:2018-02-06 07:15:54 【问题描述】:我正在将函数从 javascript 转换为 AS3,我正在尝试映射 Uint8Array 和 ByteArray 之间的调用,我注意到其中一些调用是不同的。
var data = new Uint8Array() // Javascript
var bytearray = new ByteArray(); // AS3
在 AS3 中找不到的 Javascript 调用列表:
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);
*/
【问题讨论】:
当我在回答时,您能否解释一下这些方法预计会返回什么? 我更新了问题的更多细节。 你了解 read 方法的作用吗?看起来作者想要创建一些复杂的东西但中途放弃了它,所以它实际上只是将 Math.abs(length) 字节读入常规 Array。 我不明白 read 的作用。我尝试在字节数组上使用 readByte、readUnsignedByte 等,并且位置增加一,但我认为它不起作用。我已经包含了一个相关问题的链接,我将链接发布到了源代码。 更新了我的答案。 【参考方案1】:读取UnicodeString
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");
读取字符串
// 大概读取一个非UTF(可能是ASCII)字符串。
function readString(source:ByteArray, length:uint):String
return source.readMultiByte(length, "ascii");
readLongLong
在 AS3 中有两种整数类型,int 和 uint,都是 4 个字节,所以大概是这样的
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;
告诉
需要更多信息。
【讨论】:
我发现了一些东西。作者创建了一个类(看起来没有扩展)来处理 JavaScript 中的缓冲区。这可能都是习惯性的。所以我不能说这些方法是 Uint8Array 的一部分。这可能就是为什么我找不到关于他们的信息的原因。这些将有助于转换。如果这个类与 Uint8Array 无关,我可以撤回问题。 看起来作者为旧浏览器做了一个后备类。我不知道哪些方法是 Uint8Buffer 的一部分,哪些是自定义的。但这些信息很有帮助,可能足以让我们继续前进。看起来他正在传递 Uint8Array。 @1.21gigawatts 这让我感到困惑,因为 Uint8Array 中的任何官方文档都没有关于您提到的方法的任何内容。【参考方案2】:查看as3 doc of ByteArray
readUnicodeString()
和 readString()
应该是 readUTFBytes()
我不认为 as3 有 LongIntegers,但据我所知 readDouble()
应该可以解决这个问题。
【讨论】:
我发现了一些东西。作者创建了一个类(看起来没有扩展)来处理 JavaScript 中的缓冲区。这可能都是习惯性的。所以我不能说这些方法是 Uint8Array 的一部分。这可能就是为什么我找不到关于他们的信息的原因。这些将有助于转换。如果这个类与 Uint8Array 无关,我可以撤回问题。 看起来作者为旧浏览器做了一个后备类。我不知道哪些方法是 Uint8Buffer 的一部分,哪些是自定义的。但这些信息很有帮助,可能足以让我们继续前进。以上是关于这些 JavaScript 函数在 AS3 ByteArray 中的等效调用是啥?的主要内容,如果未能解决你的问题,请参考以下文章
将数组从 Flash (AS3) 发送到 JavaScript