'writeByte'에 해당되는 글 1건

  1. 2008.12.23 바이너리 데이터
AIR/파일시스템 연동2008. 12. 23. 11:01


AS3의 가장 큰 장점중에 하나는 지금껏 AS에서 지원이 불가능했던 low level작업이 가능한 점이다. 이는 AS3와 AIR를 통하여 바이너리 데이터를 직접 만들거나 수정 또는 zip알고리즘과 jpg와 png등 이미지 처리 알고리즘을 제공함과 동시에 기타 doc와 ppt... 등 파일 형태만 알고 있다면 모든 파일을 직접 만들 수 있기 때문이다.
이와 같은 작업을 가능케하는 것이 IDataInput, IDataOutput 인터페이스를 구현한 ByteArray라는 클래스이다. 또는 flash.netURLStream(IDataInput만 구현)과 URLLoader를 사용하여도 바이너리 데이터로 접근(만) 할  수 있다.

   - ByteArray는 읽고 쓰기가 모두 가능한 바이너리 관리 전용 클래스이다.
   - URLLoader인 경우에는 바이트배열에 특화되진 않았다. data를 모두 받은 후에 접근 하여 관리한다. 
   - URLStream는 delegator에서 직접 바이트 배열을 읽을 수 있지만 IDataInput만 구현하여 기록은 불가능 하다.
     data를 받는 중에도 접근 가능하다.


ByteArray는 기본적인 바이너리 데이터를 기록하거나 읽기 위한 기본적인 클래스이며 외부 파일데이터를 가져오는 통신 클래스에서는 URLStream를 사용한다. AIR에서는 앞서 살펴본 FileStream(IDataInput, IDataOutput 인터페이스를 구현)를 사용한다.

FileStream은 ByteArray처럼 읽고 쓰기가 모두 가능한 클래스 이다. 따라서 AIR에서는 FileStream만으로 파일을 읽어 들여와 기록까지 가능해 졌다. 복잡한 바이너리 작업이라면 ByteArray를 활용하면 중간에 벌어진 틈을 부드럽게 처리 할 수 있을 것이다.


IDataInput, IDataOutput를 구현한 ByteArray 속성과 메서드 *

[ Public 속성 ]

bytesAvailable : uint
[읽기 전용] 바이트 배열의 현재 위치에서 배열 끝까지 읽을 수 있는 데이터 바이트 수입니다.

defaultObjectEncoding : uint
[정적] 새 ByteArray 인스턴스에 사용할 ByteArray 클래스의 기본 객체 인코딩을 나타냅니다.

endian : String
데이터의 바이트 순서를 Endian.BIG_ENDIAN 또는 Endian.LITTLE_ENDIAN으로 변경하거나 읽습니다.

length : uint
ByteArray 객체의 바이트 단위 길이입니다.

objectEncoding : uint
ByteArray 인스턴스에서 쓰거나 읽을 때 ActionScript 3.0, ActionScript 2.0 또는 ActionScript 1.0 형식을 사용할지 여부를 확인하는 데 사용합니다.

position : uint
ByteArray 객체에 대한 파일 포인터의 현재 위치를 바이트 단위로 옮기거나 반환합니다.

[ Public 메서드 ]
ByteArray()
이 클래스의 메서드와 속성을 사용하여 데이터 저장소 및 스트림을 최적화할 수 있도록 압축된 바이트 배열을 나타내는 ByteArray 인스턴스를 만듭니다.

clear():void
바이트 배열의 내용을 지우고 길이 및 위치 속성을 0으로 재설정합니다.

compress(algorithm:String):void
바이트 배열을 압축합니다.

deflate():void
DEFLATE 압축 알고리즘을 사용하여 바이트 배열을 압축합니다.

inflate():void
바이트 배열의 압축을 해제합니다.

readBoolean():Boolean
바이트 스트림에서 부울 값을 읽습니다.
포맷타입 : Boolean
포맷 : Boolean
0인 경우 false , 기타인 경우 true

readByte():int
바이트 스트림에서 부호 있는 바이트를 읽습니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
바이트 스트림에서 length 매개 변수로 지정된 데이터 바이트 수를 읽습니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

readDouble():Number
바이트 스트림에서 IEEE 754 배정밀도 64비트 부동 소수점 숫자를 읽습니다.
포맷타입 :  숫자
포맷 : Double
Double-precision 64비트 부동 소수점 수

readFloat():Number
바이트 스트림에서 IEEE 754 단정밀도 32비트 부동 소수점 숫자를 읽습니다.
포맷타입 :  숫자
포맷 : Float
Single-precision 32비트 부동 소수점 수


readInt():int
바이트 스트림에서 부호 있는 32비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Integer

readMultiByte(length:uint, charSet:String):String
지정된 문자 세트를 사용하여 바이트 스트림에서 지정된 길이의 멀티바이트 문자열을 읽습니다.
포맷타입 :  문자열
포맷 : Multibyte
디폴트 시스템 코드페이지 사용하지 않고 특정 문자 세트 사용

readObject():*
바이트 배열에서 AMF 직렬 형식으로 인코딩된 객체를 읽습니다.
포맷타입 :  객체
포맷 : Object
AMF를 사용한 직렬화/역직렬화된 객체

readShort():int
바이트 스트림에서 부호 있는 16비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Short
16비트정수

readUnsignedByte():uint
바이트 스트림에서 부호 없는 바이트를 읽습니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

readUnsignedInt():uint
바이트 스트림에서 부호 없는 32비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Integer
32비트정수

readUnsignedShort():uint
바이트 스트림에서 부호 없는 16비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Short
16비트정수

readUTF():String
바이트 스트림에서 UTF-8 문자열을 읽습니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

readUTFBytes(length:uint):String
바이트 스트림에서 length 매개 변수에 지정된 길이의 UTF-8 바이트 시퀀스를 읽고 문자열을 반환합니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

toString():String
바이트 배열을 문자열로 변환합니다.

uncompress(algorithm:String):void
바이트 배열의 압축을 해제합니다.

writeBoolean(value:Boolean):void
부울 값을 씁니다.
포맷타입 : Boolean
포맷 : Boolean
0인 경우 false , 기타인 경우 true

writeByte(value:int):void
바이트 스트림에 바이트를 씁니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

writeBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
지정된 바이트 배열 bytes에서 offset(0부터 시작하는 인덱스)부터 시작하여 length만큼의 바이트 시퀀스를 데이터 스트림에 씁니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

writeDouble(value:Number):void
바이트 스트림에 IEEE 754 배정밀도 64비트 부동 소수점 숫자를 씁니다.
포맷타입 :  숫자
포맷 : Double
Double-precision 64비트 부동 소수점 수

writeFloat(value:Number):void
바이트 스트림에 IEEE 754 단정밀도 32비트 부동 소수점 숫자를 씁니다.
포맷타입 :  숫자
포맷 : Float
Single-precision 32비트 부동 소수점 수

writeInt(value:int):void
바이트 스트림에 부호 있는 32비트 정수를 씁니다.
포맷타입 :  숫자
포맷 : Integer

writeMultiByte(value:String, charSet:String):void
지정된 문자 세트를 사용하여 멀티바이트 문자열을 바이트 스트림에 씁니다.
포맷타입 :  문자열
포맷 : Multibyte
디폴트 시스템 코드페이지 사용하지 않고 특정 문자 세트 사용

writeObject(object:*):void
객체를 바이트 배열에 AMF 직렬 형식으로 씁니다.
포맷타입 :  객체
포맷 : Object
AMF를 사용한 직렬화/역직렬화된 객체

writeShort(value:int):void
바이트 스트림에 16비트 정수를 씁니다.
포맷타입 :  숫자
포맷 : Short
16비트정수

writeUnsignedInt(value:uint):void
바이트 스트림에 부호 없는 32비트 정수를 씁니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

writeUTF(value:String):void
UTF-8 문자열을 바이트 스트림에 씁니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

writeUTFBytes(value:String):void
UTF-8 문자열을 바이트 스트림에 씁니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

통상적으로 IDataInput와 IDataOutput 인터페이스는 바이트 데이터를 관리하는 속성과 메서드를 선언하였으므로 이를 구현한 ByteArray와 FileStream을 이용하면 간단하게 데이터 읽기와 기록이 가능하다.
읽고 쓰기 작업시에 유효 바이트의 길이를 넘지 않기 위해 bytesAvailable속성을 이용하여 현재 위치에서 데이터 끝까지의 데이터 수를 읽어와 길이를 자르거나 필요한 만큼 읽어오며 작업을 하며, 현재 위치를 이동하거나 읽어오는 position속성과 함께 사용한다. 바로 이 둘( bytesAvailable , position )이 리드버퍼를 이용하는 속성이다.

리드버퍼란 바이트 묶음으로 구성된 컨테이너 정도라고 정의하면 된다. 데이터가 읽을 수 있는 상태가 되면 데이터는 이러한 리드 버퍼 안으로 들어오게 된다. 실제로 위의 readXXX() 메서드들은 리드버퍼의 데이터를 읽어 오는 것이며 open(동기)을 사용하면 리드버퍼에 데이터를 모두 담은 상태에서 데이터에 접근이 가능해지며 동기적 작업에서는 데이터의 모든 바이트를 바로 읽을 수 있기 때문에 사용가능한 유효 바이트를 초과하는 경우가 거의 없지만 openAsync(비동기)를 사용하면 리드버퍼에 데이터는 읽혀짐과 동시에 삭제가 되므로 다른 ByteArray의 delegator에 저장한 다음 작업하여야 한다.


참고) 1 바이트는 256가지 값의 표현이 가능하다. 1bit는 0,1로 2개의 값을 표현하고 이것이 모여 8bit(2^8)가 1바이트가 된다. 8비트는 2의 8승이며 0부터 255까지의 값을 표현 할 수 있다.

참고)
**** 오브젝트 인코딩 데이터 : AMF ****
ObjectEncoding 클래스는 객체를 직렬화하는 클래스(예: NetStream, NetConnection, SharedObject 및 ByteArray)가 이전 버전의 ActionScript와 작동할 수 있도록 합니다. 
객체 인코딩은 객체가 AMF(Action Message Format)에서 표현되는 방식을 제어합니다.
Flash Player는 AMF를 사용하여 Flash 응용 프로그램과 원격 서버 간의 효율적인 통신을 가능하게 합니다.
AMF는 원격 프로시저 호출을 압축된 이진 표현으로 인코딩하여 Flash Media Server에서 사용되는 HTTP/HTTPS 또는 RTMP/RTMPS 프로토콜을 통해 전송될 수 있도록 합니다.
ActionScript 객체 및 데이터 값은 이진 형식으로 직렬화됩니다.
이것은 일반적으로 XML 등과 같은 표현보다 더 압축된 형식입니다.
    
Flash Player 9는 AMF3 및 AMF0의 두 가지 다른 형식으로 직렬화할 수 있습니다.
AMF3은 ActionScript 3.0에서 사용되는 기본 직렬화로 ActionScript 1.0 및 2.0에서 사용되는 AMF0보다 다양한 장점을 제공합니다. AMF3은 AMF0보다 네트워크를 통해 더 효율적으로 데이트를 전송합니다.
또한, int 및 uint 객체를 정수로 전송하는 것을 지원하며, ByteArray, XML 및 IExternalizable 등 ActionScript 3.0에서만 사용 가능한 데이터 유형을 지원합니다. 이것은 ActionScript 3.0 및 Flex 2와 같은 AMF3 인코딩을 사용하는 서버에서만 사용할 수 있습니다.

ByteArray, NetConnection, NetStream, SharedObject, Socket 및 URLStream 클래스에는 ObjectEncoding 클래스로부터 상수가 할당되는 objectEncoding 속성이 포함되어 있습니다. objectEncoding 속성의 비헤이비어는 객체에 따라 달라집니다.

참고) endian자료 보기
Posted by 버터백통