전문을 만들고 있는데, binary mode 로 전문에 어떻게 담아야할까요?

정말 대충 만들어봤는데… 이렇게해도 안될까요?


        public class 전문그룹
        {
            public string 업무구분코드 { get; set; } = string.Empty;
            public int 레코드구분 { get; set; }
            public int 일련번호 { get; set; }
            public DateTime 신청일 { get; set; } = DateTime.Now;
            public string 기관코드 { get; set; } = string.Empty;

            public List<전문전문열매> Datas { get; set; } = new List<전문전문열매>();

            public byte[] 전문만들기()
            {
                byte[] retVal = new byte[0];
                StringBuilder 전문 = new StringBuilder();
                전문.Append(업무구분코드.Length <= 6 ? 업무구분코드.PadRight(6, ' ') : 업무구분코드.Substring(0, 6));
                전문.Append(레코드구분.ToString().PadLeft(2, '0'));
                전문.Append(일련번호.ToString().PadLeft(7, '0'));
                전문.Append($"{신청일:yyyyMMdd}");
                전문.Append(기관코드.PadRight(20, ' '));
                전문.Append(Datas.Count().ToString().PadLeft(7, '0'));
                var headerBytes = Encoding.Default.GetBytes(전문.ToString());
                retVal =  retVal.Concat(headerBytes).ToArray();
                string filler = "".PadRight(974, ' ');
                retVal = retVal.Concat(Encoding.Default.GetBytes(filler)).ToArray();
                foreach (var data in Datas)
                {
                    retVal = retVal.Concat(data.전문만들기()).ToArray();
                }
                return retVal;
            }
        }

        public class 전문전문열매
        {
            public string 업무구분코드 { get; set; } = string.Empty;
            public int 레코드구분 { get; set; }
            public int 일련번호 { get; set; }
            public string 필러 { get; set; } = string.Empty;
            public string 기관코드 { get; set; } = string.Empty;
            public string 납부자번호 { get; set; } = string.Empty;
            public int 은행코드 { get; set; }
            public string 계좌번호 { get; set; } = string.Empty;
            public DateTime 신청일 { get; set; } = DateTime.Now;
            public int 동의자료구분 { get; set; }
            public string 동의자료확장자 { get; set; } = string.Empty;
            public byte[] 동의자료데이터 { get; set; }

            public byte[] 전문만들기()
            {
                byte[] retVal = new byte[0];
                StringBuilder 전문 = new StringBuilder();

                전문.Append(업무구분코드.Length <= 6 ? 업무구분코드.PadRight(6, ' ') : 업무구분코드.Substring(0, 6));
                전문.Append(레코드구분.ToString().PadLeft(2, '0'));
                전문.Append(일련번호.ToString().PadLeft(7, '0'));
                전문.Append(필러.ToString().PadLeft(10, ' '));
                전문.Append(기관코드.PadRight(20, ' '));
                전문.Append(납부자번호.PadRight(30, ' '));
                전문.Append(은행코드.ToString().PadLeft(3, '0'));
                전문.Append(계좌번호.Replace("-", "").PadRight(20, ' '));
                전문.Append($"{신청일:yyyyMMdd}");
                전문.Append(동의자료구분);
                전문.Append(동의자료확장자.PadRight(5, ' '));
                전문.Append(동의자료데이터.Length.ToString().PadLeft(7, '0'));
                retVal = Encoding.Default.GetBytes(전문.ToString());
                retVal = retVal.Concat(동의자료데이터).ToArray();
                string filler = "".PadRight(1024-((동의자료데이터.Length-905) % 1024), ' ');
                retVal = retVal.Concat(Encoding.Default.GetBytes(filler)).ToArray();

                return retVal;
            }
        }
2개의 좋아요

byte[] binaryData;
binaryData = System.IO.File.ReadAllBytes(filePath);

                string strPdfbinaryData = "";
                foreach (byte b in binaryData)
                {
                    strPdfbinaryData += b.ToString();
                }

위와 같은 소스 코드로 jpg 파일을 문자열로 변환 했더니, 문제가 있긴 합니다.

예를 들어 jpg 파일이 2614 바이트라면, 제일 앞에 식별정보(119 바이트) + jpg파일(2614 바이트) + 빈공간(339 바이트) 이렇게 해서 총 3072 바이트로 전문이 만들어져야 하는데요.

위의 소스 코드로 하면… 6613 바이트가 되어버리네요

2개의 좋아요

알려주신 방법으로 한번 해볼게요!!

2개의 좋아요

3072로 보내는게 아니라 헤더까지 포함되어서 4096이 되어야할듯요.
그리고 binaryData 를 가져와서 다른 처리하지말고 '전문전문열매’의 '동의자료데이터’에 바로 넣어보세욥.

1개의 좋아요

retVal = retVal.Concat(agreeDatas).ToArray();
sb.Append(retVal);
// FILLER 계산
// (1024 - (119 + 동의자료 길이) MOD 1024)) MOD 1024
int filler = (1024 - (119 + Convert.ToInt32(data.DATA_LENGTH)) % 1024) % 1024;
sb.Append(FILLER.PadRight(filler)); //FILLER

이런식으로 동의자료 전문을 만들었는데요… agreeDatas 는 byte 배열로 만들어진 동의자료구요… 그랬더니 전문이 아래와 같이 만들어지네요 ㅜㅜ

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

AE1112220000001 9966910448 48100002222 0201005901786310 202304041jpg 0002614System.Byte[] AE11123399999999966910448 00000010000000000

1개의 좋아요

넵 헤더까지 하면 4096 이 되어야해요

1개의 좋아요

ㅇㅅㅇ그냥 '전문그룹’에 데이터 넣고 전문만들기()만 호출해보셨나요?ㅎㅎㅎ
갑자기

retVal = retVal.Concat(agreeDatas).ToArray();
sb.Append(retVal);
// FILLER 계산
// (1024 - (119 + 동의자료 길이) MOD 1024)) MOD 1024
int filler = (1024 - (119 + Convert.ToInt32(data.DATA_LENGTH)) % 1024) % 1024;
sb.Append(FILLER.PadRight(filler)); //FILLER

이게 어디서 나왔는지요…ㅎㅎㅎ

1개의 좋아요

아 저건 제가 전문 만들려고 만든 소스 코드에, 활어님이 알려주신 내용으로 수정해본거에요 ㅜㅜ

1개의 좋아요
AgreeData agreeData1 = new AgreeData
                {
                    Id = 1,
                    DATA_RECORD = "22",
                    DATA_SNO = "0000001",
                    CMS_ACCOUNT_COPR_CD = orgCode,
                    PAYER_NO = "48100002222",
                    BANK_CODE = "020", // 우리은행 020
                    ACCOUNT_NO = "1005901786310",
                    REG_DATE = DateTime.Today.ToString("yyyyMMdd"),
                    DIVISION = "1",
                    EXTENSION = "jpg",
                    DATA_LENGTH = "2614",
                    DATA_BYTE = agreeDatas[0]
                };

                // List에 AgreeData 개체 추가
                List<AgreeData> agreeDataList = new List<AgreeData> { agreeData1 };

                #endregion

                //Header Record                    
                sb.Append("AE1112"); //업무구분코드(AE1112)
                sb.Append("11"); //Record 구분
                sb.Append("0000000"); //일련번호(0000000)
                sb.Append(DateTime.Today.ToString("yyyyMMdd")); //신청일자

                // test를 위해 임의로 기관코드와 총 동의자료 갯수를 넣음
                sb.Append(orgCode.PadRight(20)); //기관코드
                sb.Append(agreeDataList.Count.ToString().PadLeft(7, '0')); //총 동의자료 개수(length 7 : Data Record 내에 수록된 총 동의자료 개수)
                // test를 위해 임의로 기관코드와 총 동의자료 갯수를 넣음

                sb.Append(FILLER.PadRight(974)); //FILLER                   

                //Data Record
                //List<AgreeData>? agreeDataList = basedata.AGREE_DATA_LIST;

                int totalFileSize = 0;
                byte[] retVal = new byte[0];
                if (agreeDataList != null)
                {
                    foreach (AgreeData data in agreeDataList)
                    {
                        sb.Append("AE1112"); //업무구분코드
                        sb.Append(data.DATA_RECORD); //Record구분(22)
                        sb.Append(data.DATA_SNO); //Data일련번호(00000001 부터 순차적으로)
                        sb.Append(FILLER.PadRight(10));
                        sb.Append(data.CMS_ACCOUNT_COPR_CD?.PadRight(20)); //기관코드
                        sb.Append(data.PAYER_NO?.PadRight(30)); //납부자번호(기관에서 부여한 납부자의 식별번호(두 개 이상의 계좌에 동일한 납부자번호를 사용할 수 없음))
                        sb.Append(data.BANK_CODE); //은행점코드
                        sb.Append(data.ACCOUNT_NO?.PadRight(20)); //계좌번호
                        sb.Append(DateTime.Today.ToString("yyyyMMdd")); //신청일자
                        sb.Append(data.DIVISION); //동의자료 구분"1" : 서면, "2" : 전자문서 - 공인전자서명,  "3" : 전자문서 - 일반전자서명,
                                                  //"4" : 녹취,  "5" : ARS,  "6" : 전자문서 - 기타
                        sb.Append(data.EXTENSION?.PadRight(5));
                        sb.Append(data.DATA_LENGTH?.PadLeft(7, '0'));
                        totalFileSize += Convert.ToInt32(data.DATA_LENGTH);


                        ////////////////////

                        retVal = retVal.Concat(agreeDatas).ToArray();
                        sb.Append(retVal);
                        // FILLER  계산
                        // (1024 - (119 + 동의자료 길이) MOD 1024)) MOD 1024
                        int filler = (1024 - (119 + Convert.ToInt32(data.DATA_LENGTH)) % 1024) % 1024;
                        sb.Append(FILLER.PadRight(filler)); //FILLER

                        //string filler = "".PadRight(1024 - ((data.DATA_BYTE.Length - 905) % 1024), ' ');
                        //retVal = retVal.Concat(Encoding.Default.GetBytes(filler)).ToArray();

                        //////////////////////////////


                        //////////////////////////////
                        //sb.Append(data.DATA);
                        // FILLER  계산
                        // (1024 - (119 + 동의자료 길이) MOD 1024)) MOD 1024
                        //int filler = (1024 - (119 + Convert.ToInt32(data.DATA_LENGTH)) % 1024) % 1024;
                        //sb.Append(FILLER.PadRight(filler)); //FILLER
                        /////////////////////////////////
                    }
                }

// 등록해지요청 Data 클래스
public class AgreeData
{
public long Id { get; set; }
public string? DATA_RECORD { get; set; } //Data RECORD(Data 는 “22”)
public string? DATA_SNO { get; set; } //일련번호 0000001 부터 시작
public string? CMS_ACCOUNT_COPR_CD { get; set; } //기관코드
public string? PAYER_NO { get; set; } //납부자번호
public string? BANK_CODE { get; set; } //은행코드
public string? ACCOUNT_NO { get; set; } //계좌번호
public string? REG_DATE { get; set; } //신청일자
public string? DIVISION { get; set; } //동의자료 구분(“1” : 서면, “2” : 전자문서-공인전자서명,“3” : 전자문서-일반전자서명,
//“4” : 녹취, “5” : ARS, “6” : 전자문서-기타)
public string? EXTENSION { get; set; } //동의자료 확장자
public string? DATA_LENGTH { get; set; } //동의자료 길이
public string? DATA { get; set; } //동의자료 데이타

        public byte? DATA_BYTE { get; set; } //동의자료 데이타
    }

========== 위 소스 코드가 제가 만들어본 것 이거든요 … 활어 님이 알려주신 부분처럼 수정하려면 어떻게 해야할까요…넘 죄송합니다 초보라서 ㅜㅜ

1개의 좋아요

제가 드린 클래스에 데이터를 다 넣고 변환은 해보셨나욥?

1개의 좋아요

아니요,데이터를 다 넣고 변환이라는게 무슨 말인지 모르겠습니다 ㅠㅠ

1개의 좋아요

제 생각은 코딩보다 앞서서 문서와 샘플을 통해 정확한 Data Record를 만드는 방법부터 확인하셔야 할 것 같습니다. 만약 동의자료 Data가 바이너리 데이터라면 전문을 string이 아니라 byte[]로 만드는 것이 맞습니다.

보통 이런 일은 샘플을 요구할 수 있습니다. 물론 샘플이 C 코드라던가 다른 프로그래밍 언어일 수는 있으나 패킷 구조는 샘플을 통해 파악하실 수 있습니다.

2개의 좋아요

이렇게요.

            전문그룹 그룹 = new 전문그룹()
            {
                업무구분코드 = "AE1112",
                레코드구분 = 1,
                일련번호 = 1,
                기관코드 = "9964200055",
                신청일 = DateTime.Now,
            };

            그룹.Datas.Add(new 전문전문열매()
            {
                업무구분코드 = "AE1112",
                레코드구분 = 22,
                일련번호 = 1,
                기관코드 = "9964200055",
                납부자번호 = "",
                은행코드 = 100,
                계좌번호 = "11112223333",
                신청일 = DateTime.Now,
                동의자료구분 = 1,
                동의자료확장자 = "pdf",
                동의자료데이터 = new byte[0] 
            });
            var 결과 = 그룹.전문만들기();
2개의 좋아요

샘플을 요청하였지만,해당 업체에서 제공해주지 않는다고 해서요 …

2개의 좋아요

아!!! 해보겠습니다!!!

2개의 좋아요

123123123213213123

알려주신 대로 하면요, “결과” byte 배열 변수에 3072 바이트로 잘 담기는데요…

이제 저 바이트 배열을 .txt 파일로 만들어야 하거든요…

그건 어떻게 해야할까요?

string 전문;
foreach (byte b in 결과)
{
전문 += b.ToString()
}

이런식으로 해야할까요 ㅠㅠ?

2개의 좋아요

그거는 고객이 원하는 대로 넣어야쥬…ㅎㅎㅎ
출력 방법은 워낙 많아서…ㅋㅋㅋ
그냥 File.WriteAllBytes로 해보세요~

2개의 좋아요

네 한번 해볼게요 감사합니다!!

2개의 좋아요

전문은 총 8192 바이트네요.

var 전문 = new byte[8192]

동의정보는 파일에서 읽어오면 되구요.

binaryData = System.IO.File.ReadAllBytes(filePath);

이 정보를 전문의 적절한 위치에 복사하기만 하면 될 것 같은데요.

Array.Copy(binaryData, 0, 전문, {동의정보가 위치할 전문의 시작 인덱스}, binaryData.Length)
1개의 좋아요

답변 감사합니다 비슷한 방식으로 해결햏ㅆ어요!!

1개의 좋아요