2010-03-10 3 views
0

파일을 외부 리소스로 호출하는 대신 AS3 코드에 직접 바이트 문자열로 '포함'해야합니다.AS3 코드의 파일 (바이트 문자열)

var testString = "537563636573733a20537472696e672072652d656e636f6465642e"; 
var testArray:ByteArray = new ByteArray(); 
var len:uint = testString.length; 

trace("testString LENGTH: " + len.toString()); 

for (var i:uint = 0; i < len; i += 2) { 
    var c:String = '0x' + testString.charAt(i) + testString.charAt(i + 1); 

    if(i < 10) { trace("testString Byte: " + c); } 

    testArray.writeByte(parseInt(c)); 
} 

trace("testString: " + testArray.toString()); 
trace("testString NUMBER OF BYTES: " + testArray.length.toString()); 

을 그리고 콘솔이 생산 :

그래서이 작품을 잘

testString LENGTH: 54 
testString Byte: 0x53 
testString Byte: 0x75 
testString Byte: 0x63 
testString Byte: 0x63 
testString Byte: 0x65 
testString: Success: String re-encoded. 
testString NUMBER OF BYTES: 27 

나는 16 진수 편집기 (HxD) 내 목표 파일을 열고 복사 바이트를 붙여 그래서 다음 위와 마찬가지로 String 변수에 직접 입력하면 콘솔에 다음 출력이 표시됩니다.

testString LENGTH: 97478 
testString Byte: 0x50 
testString Byte: 0x4B 
testString Byte: 0x03 
testString Byte: 0x04 
testString Byte: 0x14 
testString: PK``` 
testString NUMBER OF BYTES: 48739 

... (URLLoader를 사용하여) 외부 리소스로 사용할 때 완벽하게 읽은 동일한 라이브러리에서 ByteArray로 파일을 읽을 수 없습니다.

코드에서 바이트 문자열을 복사 해 보았습니다. 그것을 16 진수 편집기에 붙여 넣은 다음 파일로 저장하면 파일이 올바르게 다시 만들어져 복사 및 붙여 넣기 문제가 아닌 것 같습니다. 또한 각 바이트 문자열 앞에서 '0x'를 제거하고 "parseInt (c, 16)"로 구문 분석하면 정확히 동일한 결과가 생성됩니다.

일부 추가 배경의 경우 대상 파일은 KMZ 3D 모델이며 파일은 Nochump 라이브러리를 사용하여 KMZ 파일의 압축을 해제하는 Papervision3D의 KMZ.as 라이브러리에 의해 구문 분석됩니다. KMZ.as로 된 ByteArray를 통과 할 때 내가 돌아올 오류 메시지는 다음과 같습니다

Error: invalid zip 
    at nochump.util.zip::ZipFile/findEND() 
    at nochump.util.zip::ZipFile/readEND() 
    at nochump.util.zip::ZipFile/readEntries() 
    at nochump.util.zip::ZipFile() 
    at org.papervision3d.objects.parsers::KMZ/parse() 
    at org.papervision3d.objects.parsers::KMZ/load() 
    at infoModel/initKMZ2() 
    at infoModel() 

어떤 생각 및/또는 제안 크게 감상 할 수있다.

사료

답변

0

데이터를 문자열 대신 바이트 배열로 저장하지 않는 이유는 무엇입니까? 그건 훨씬 더 컴팩트 한 것입니다 (문자열에 필요한 여러 바이트 대신 바이트 당 1 바이트). int로 다시 구문 분석 할 필요가 없습니다.

function toByteArray(a:Array):ByteArray { 
    var bytes:ByteArray = new ByteArray(); 
    for each(var b:int in a) { 
    bytes.writeByte(b); 
    } 
    return bytes; 
} 

var testData:ByteArray = toByteArray([ 
    0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 
    0x73, 0x3a, 0x20, 0x53, 0x74, 0x72, 
    0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 
    0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 
    0x65, 0x64, 0x2e //, ... 
]); 
+0

안녕 Herms의 시도 주셔서 감사합니다 - 그것은 좋은 생각과는 문자열과 바이트 사이에 교환하는 데에서 저를 유지합니다. 불행히도, 같은 "잘못된 우편"오류가 여전히 발생합니다. 파일의 바이트를 포함하는 배열이 너무 큰 경우에도 새로운 오류가 발생합니다. "ABC 데이터가 손상되어 읽을 수 없습니다." 그러나 모델의 크기를 줄이면 오류가 발생하지 않습니다. – fodder

0

[Embed()] 태그를 사용하십시오.

// Put this as a member variable in one of your classes somewhere 
[Embed(source="object.kmz", mimeType="application/octet-stream")] 
private static var myKMZ :Class; 

이제 myKMZ는 ByteArray를 확장하는 클래스입니다.

어떻게 데이터를 얻을 수 있습니다 :

var myKMZbytes :ByteArray = new myKMZ() as ByteArray;