정말 대충 만들어봤는데… 이렇게해도 안될까요?
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개의 좋아요
힘내쿠우
23
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개의 좋아요
3072로 보내는게 아니라 헤더까지 포함되어서 4096이 되어야할듯요.
그리고 binaryData 를 가져와서 다른 처리하지말고 '전문전문열매’의 '동의자료데이터’에 바로 넣어보세욥.
1개의 좋아요
힘내쿠우
26
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개의 좋아요
ㅇㅅㅇ그냥 '전문그룹’에 데이터 넣고 전문만들기()만 호출해보셨나요?ㅎㅎㅎ
갑자기
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개의 좋아요
힘내쿠우
29
아 저건 제가 전문 만들려고 만든 소스 코드에, 활어님이 알려주신 내용으로 수정해본거에요 ㅜㅜ
1개의 좋아요
힘내쿠우
30
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개의 좋아요
힘내쿠우
32
아니요,데이터를 다 넣고 변환이라는게 무슨 말인지 모르겠습니다 ㅠㅠ
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개의 좋아요
힘내쿠우
35
샘플을 요청하였지만,해당 업체에서 제공해주지 않는다고 해서요 …
2개의 좋아요
힘내쿠우
37
![123123123213213123]()
알려주신 대로 하면요, “결과” byte 배열 변수에 3072 바이트로 잘 담기는데요…
이제 저 바이트 배열을 .txt 파일로 만들어야 하거든요…
그건 어떻게 해야할까요?
string 전문;
foreach (byte b in 결과)
{
전문 += b.ToString()
}
이런식으로 해야할까요 ㅠㅠ?
2개의 좋아요
그거는 고객이 원하는 대로 넣어야쥬…ㅎㅎㅎ
출력 방법은 워낙 많아서…ㅋㅋㅋ
그냥 File.WriteAllBytes로 해보세요~
2개의 좋아요
전문은 총 8192 바이트네요.
var 전문 = new byte[8192]
동의정보는 파일에서 읽어오면 되구요.
binaryData = System.IO.File.ReadAllBytes(filePath);
이 정보를 전문의 적절한 위치에 복사하기만 하면 될 것 같은데요.
Array.Copy(binaryData, 0, 전문, {동의정보가 위치할 전문의 시작 인덱스}, binaryData.Length)
1개의 좋아요
힘내쿠우
41
답변 감사합니다 비슷한 방식으로 해결햏ㅆ어요!!
1개의 좋아요