좀실무적인걸원한다길래

얘전에했던업무를응용해

보았읍니다관련된정보는


https://en.wikipedia.org/wiki/Type-length-value

https://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One


등이있읍니다


낼아침부터짜기시작해봐야겠읍니다.



=============================================================================================================================================

두개의시스템(T,B)이있습니다.

시스템T는덱스트파일로입출력을하는시스템입니다. 반면,시스템B는바이너리파일을입출력에사용합니다.
여러분은두시스템을연동시키는프로젝트에투입되었읍니다. 맡은일은아래의두기능을지원하는유틸리티를만드는것입니다.

기능1. 시스템B의출력을시스템T의입력으로변환합니다.

    B의출력물: systemB.out
    T의입력물: systemT.in

기능2. 시스템T의출력을시스템B의입력으로변환합니다.

    T의출력물: systemT.out
    B의입력물: systemB.in

여러분의프로그램은다음과같이실행되어야합니다.

transform -bt systemB.out ==> systemT.in 파일을생성함
transform -tb systemT.out ==> systemB.in 파일을생성함

이와함께,각시스템에서사용되는인코딩방식의정보를받았읍니다.

T시스템은아래와같이JSON형식으로된입출력파일을사용합니다.

{
        "name": "Santa",
        "age": 0,
        "address": "North pole HOHOHO",
        "pet": { "name": "rudolph", "species": "reindeer" },
        "language": [ "en", "ko", "ru" ],
    "isAlive": false   
}

아래형식도위와동일하게처리되어야합니다.

{
        "name": "Santa",
        "age": 0,
        "address": "North pole HOHOHO",

        "pet": {
        "name": "rudolph",
        "species": "reindeer"
    },

        "language": [
        "en",
        "ko",
        "ru"
    ],

    "isAlive": false
}

B시스템은아래의방식대로입출력파일을구성합니다.
가독성을위해포멧해놓은것으로,실제파일은일련의바이트로구성되어있읍니다.

04
    010553616E7461
    020130
    03174E6F72746820706F6C6520484F484F484F
    04 0603706574
        01077275646F6C7068
        06077370656369657306087265696E64656572
    00
    05 06086C616E6775616765 03 06
        02656E
        026B6F
        027275
    00
    09 06076973416C697665 46
00





아래는위의시스템B데이터를이해하는데필요한정보입니다.

JSON파일의정보들(변수/객체/배열이름과값)을아래에설명된데이터형식들과인코딩방식들을사용하여바이트배열로변환합니다.
타잎을나타내는데1바이트를사용하며,길이역시1바이트를사용합니다.

값부분은문자열또는불린의경우ASCII코드로저장하고,정수형은숫자그대로저장합니다.

시스템에서지원하는데이터타잎은다음과같읍니다.

기본데이터타잎: 타잎코드 - 의미 - 표현방식

complex: 04     - 객체 - 타잎 객체명 프로퍼티명 프로퍼티값... 00
array:   05   - 벼열 - 타입 배멸명 원소의갯수 원소데이터타잎 원소... 00
string:  06   - 문자열 - 타잎 길이(x 바이트) 값
integer: 07   - 숫자 - 타잎 길이(1 ~ 4바이트) 값
boolean: 09     - 불리언 - 타잎 변수명 변수값

타잎은각자료형의타잎코드,길이는자료형의값의길이를바이트로나타낸것입니다.

커스텀데이터타잎: 타잎코드 - 의미 - 표현방식

변수명이고정된데이터타입들로B포멧에선변수명을생략합니다대신T포멧으로변환시지정된병수명을사용합니다

name:     01 - string형으로T포멧으로변환시"name"을변수명으로사용 - 타잎 변수값의길이(x바이트) 변수값
age:     02 - integer형으로T포멧으로변환시"age"를변수명으로사용 - 타잎 길이(1~4바이트) 변수값
address: 03 - string형으로T포멧으로변환시"address"를변수명으로사용 - 타잎 길이(x바이트) 변수값
phoneNumbers: 08 - 객제배열형으로T포멧으로변환시"phoneNumbers"를배열명으로사용 - 타잎 길이(원소의갯슈) 원소타잎(04) 원소객체...

변환얘제:

"var": "val" => 0603766172060376616C

변수명 => 06(타잎) 03(길이) 76 61 72 (값=var)
변수값 => 06(타잎) 03(길이) 76 61 6C (값=val)

*문자열을나타네는"는무시합니다반대로시스템T형식으로바꿀때는모든문자열은"로둘러쌓여야합니다.

"age": 0 => 02(타잎) 01(길이) 00(값)

Complex타잎은길이정보가없으며객체의이름이있을경우이를위와동일한방식으로표현하고,0x00로끝을나타냅니다.

"pet": {        ==> 04(타잎-객체) 06(타잎)03(길이-바이트)706574(값) ==> 문자열"pet"이객체이름입니다.
 "name": "rudolph",     ==> 01(타잎-"name")07(길이)7275646F6C7068(값)
 "species": "reindeer"     ==> 06(타잎-문자열)07(길이)73706563696573(값-species) 06(타잎-문자열)08(길이)7265696E64656572(값-reindeer)
}             ==> 00(객체의끝)

*객체를표현하는{나}는무시합니다반대로시스템T형식으로변환할때는모든객체를{와}로둘러쌓야합니다.

Array타잎은타잎/배열이름/원소의갯수/원소의데이터타잎/실제원소..들로표현하고,0x00로끝을나타냅니다. Array의원소는모두같은데이터타잎이여야합니다.

"language": [    ==> 05(타잎-배열) 06(타잎-문자열)08(길이)6C 61 6E 67 75 61 67 65(값-문자열"language"-배열명) 03(길이-3개의원소) 06(배열원소타잎-문자열)
    "en",     ==> 02(길이)656E(값)
    "ko",    ==> 02(길이)6B6F(값)
    "ru"    ==> 02(길이)7275(값)
 ]          ==> 00(배열으끝)

*원소를둘러싼[와]는무시합니다,시스템T형식으로변환시에는반드시사용해야합니다

boolean타잎은타잎/변수명/값으로나타내며,길이는표시하지않읍니다.
T또는F를값으로가집니다.

"isAlive": false ==> 09(타잎)06(타잎-문자열)07(길이)69 73 41 6C 69 76 65(값-isAlive) 46(F-false, 54==T==true)

*변수명의"는무시하며시스템T형식으로변환할땐사용해야합니다.

첨부된exampleB.in과exampleT.out을이용해기능1과2를완성하고
완성된프로그램으로첨부된systemT.out파일을systemB.in파일로변환해보세요.


txt확장자를zipx로바꾸거나없애면됩니다.

=============================================================================================================================================