반응형
이 방법에 대한 업데이트가 이루어졌습니다.
2011/11/21 - [I.T/Programming] - [Java]byte[] OutParameter, 리턴 값 다수(Return Data) 등의 방법 모색(Final)


왜 byte[]를 아웃파라미터로 주고받냐?
Return해서 받으면 되지 -_-?? 실무에서는 리턴값을 에러코드로 쓰기 쉽상이고,
받아올 데이터가 2개이상이면, 구조체로 포맷을 만들어서 여러 변수를 끌고다니거나 해야한다.
그러니.. 가독성이나, 응용단에서 쓰기 쉽게 하기 위해 인터페이스를 정의 하는 사람들로서는
이런 작업을 해주어야 한다.

정의된 인터페이스를 응용단에서 잘 쓰기위해서는 파라미터의 형이 되도록

통일 되어야하고, String이나 StringBuffer 보단 byte[]로 주고받는 것이 현명한 선택이라고 알고 있다.
C에서는 Data는 *char, char[]를 통해서
길이는 int*를 주어서 하면 되었으나...

Java는 포인터가 없으니 =_=.. 그러나 원리적인 부분은 비슷하다. ;ㅁ;
그럼 Java에서 byte[]를 아웃파라미터로 넘기고 받는 부분을 살펴보겠다.

쏘스 보잡~

1. Main함수에서 Hash 함수를 콜한다.


 public static void main(String[] agrv) throws Exception
 {  
  String strData = "전자서명 할 처방데이터입니다.";
  abBuffer = new byte[512];  // 여유롭게 빈공간 할당에서 아웃파라미터로 준다
  abLen = new byte[4];    // 길이를 Int가 아닌 byte[] 배열로 4공간을 할당.
  nRet = API.Hash("SHA1", strData.getBytes(), abBuffer, abLen); //함수호출
  if( nRet != 0 )
  {
   System.out.println("Hash Fail. ");
  }
  byte[] abHashedData = new byte[UtilManager.ByteToInt(abLen)];     
  //빈공간만큼 실제 아웃풋데이터 선언 및 할당
  System.arraycopy(abBuffer, 0, abHashedData, 0, UtilManager.ByteToInt(abLen)); 
  //길이만큼 복사
  
  System.out.println("Original Message : " + strData);
  System.out.println("HashedData SHA1 : " + new String(abHashedData));
  System.out.println("HashedData SHA1(HEX) : "
                             + HexUtil.byteToHex(abHashedData).toUpperCase());
 }  

2. 매인에서 불렀던 Hash 함수

 public int Hash(String strAlg, byte[] abData, byte[] abHashedData, byte[] abHashedDataLength )throws Exception
 {  
  
  byte[] abBuffer = null;
  try{   
   
   abBuffer = Hash.MakeHash(strAlg, abData); // 더욱 밑단의 함수 해쉬수행 결과가 byte[]형태로 리턴된다.
   int length = abBuffer.length;
   
   //Out Param save
   System.arraycopy(UtilManager.intToByte(length), 0, abHashedDataLength, 0, 4);  //결과값 길이를 byte[4]화 하여 복사
   System.arraycopy(abBuffer, 0, abHashedData, 0, length); //그 길이만큼 여유많은 빈공간에 복사.
         
  }     
     catch (Exception e)
  {   
   throw new Exception(" Hash Fail " + e.toString());
  }
     return 0;
     
 }

3. UtilManager의 byteToHex // intToByte // BytetoInt

 static public int ByteToInt(byte[] abNum)
 {
  int datasize = 0;
  
        if (abNum.length == 4) {
            datasize =
                    (( (int) abNum[0] & 0xFF) << 24) +
                            ( (int) (abNum[1] & 0xFF) << 16) +
                            ( (int) (abNum[2] & 0xFF) << 8) +
                            ( (int) (abNum[3] & 0xFF) << 0);
             /*(
              ((int)abNum[0] << 24 ) & 0xFF+
              ((int)abNum[1] << 16 ) & 0xFF+
              ((int)abNum[2] <<  8 ) & 0xFF+
              ((int)abNum[3] <<  4 ) & 0xFF
              );*/
        } else {
            datasize =
                    ((abNum[0] & 0xFF) << 8) +
                            ((abNum[1] & 0xFF) << 0);
        }
        return datasize;
       
 }
 
 static public byte[] intToByte(int nNum)
 {
  byte[] abNum = new byte[4];
  abNum[3] = (byte) (nNum);
  abNum[2] = (byte) ((nNum >> 8));
  abNum[1] = (byte) ((nNum >> 16));
  abNum[0] = (byte) ((nNum >> 24));

  return abNum;
 }
 
public static String byteToHex(byte[] buf)
     {
   char[] HEX_CHARS = "0123456789abcdef".toCharArray();
   char[] chars = new char[2 * buf.length]; 
 
   for (int i = 0; i < buf.length; ++i) 
         { 
             chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4]; 
    chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F];
   } 
 
   return new String(chars); 
     } 
 


보충 설명을 하자면,..

1. 응용단에서 넉넉한 여유공간을 할당에서 선언한 byte[]를 아웃파라미터로 넘겨 함수를 콜한다.
   - Data에 해당되는 넉넉한 byte[]와, 길이에 해당되는 byte[4]를 쌍으로 넘기도록 한다.
// 이러면 호출전 응용단에서 할일은 끝이다.

2. 함수 내부에서든, 더 밑단까지 갔다오든 응용단에 넘겨줄 데이터가 생성된다.
3. 함수 내부에서 생성된 데이터의 길이를 IntToByte 한다. (4byte)
4. 길이를 아웃파라미터(Length)에 arraycopy한다.
5. 그 길이만큼 아웃파라미터(Data)에 arraycopy한다. 
// 이러면 호출 된 함수내부에서의 할일은 끝이다.

6. 응용단에서는 받아온 Length(byte[4])를 ByteToInt하여 그 길이만큼 실제 변수를 선언, 할당한다.
7. 그 길이만큼 Data를 Arraycopy한다.
// 이러면 넉넉한 여유공간의 버퍼에서, 실제 딱 맞는 사이즈의 OutData가 만들어진 것이다.


간단하고 쉬운 것이다, 구글에서 찾을 땐 없다. 초보적인 항목이긴하나..
난 애좀 먹었었다. StringBuffer 써보고 =_= 막....


이 방법에 대한 업데이트가 이루어졌습니다.
2011/11/21 - [I.T/Programming] - [Java]byte[] OutParameter, 리턴 값 다수(Return Data) 등의 방법 모색(Final)













반응형
Posted by Rainfly
l