박력돌이

wooristar.egloos.com

포토로그


애드센스와이드


[CAPL] memcpy 함수 사용 Vector(CANoe)

memcpy함수는 src에서 tgt로 바이트 복사하는 기능으로 src는 소스, dest는 복사위치이다.

함수 사용 문법은 아래와 같다.

void memcpy(byte dest[], struct source) // form 1
void memcpy(byte dest[], int offset, struct source) // form 2
void memcpy(struct dest, byte source[]) // form 3
void memcpy(struct dest, byte source[], int offset) // form 4
void memcpy(struct dest, struct source); // form 5
void memcpy(struct dest, char source[]); // form 6
void memcpy(struct dest, char source[], dword offset); // form 7
void memcpy( byte dest[], byte source[], dword length); // form 8
void memcpy( char dest[], byte source[], dword length); // form 9
void memcpy( byte dest[], char source[], dword length); // form 10
void memcpy( char dest[], char source[], dword length); // form 11

위에서 보면 소스나 dest는 바이트 배열 또는 구조체로 하면 된다.

복사되는 내용은 src -> dest이다.

즉, 구조체의 내용을 바이트 배열에 복사할 수 도 있고 그 반대도 가능하다.

참고적으로 위 형식에서 유의할 점은 바이트는 무조건 배열을 써야하고 다른 상대쪽은 구조체를 써야한다는 것이다.

구조체는 dword, word 등이 적절하다.

예제)
//-------------사용할 변수 설정--------------------
byte data[4];
struct WrapDword
{
dword dw;
} dwordWrapper;

int i;
for (i = 0; i < elcount(data); ++i)
data[i] = i;

//-------------memcpy 사용 (data배열변수의 값을 dwordWrapper구조체 내의 dw에 복사해 넣음)-----------
memcpy(dwordWrapper, data);
write("Bytes as dword: %0#10lx", dwordWrapper.dw);
dwordWrapper.dw = 0x12345678;

//-------------memcpy 사용 (위와 반대로 복사)--------------------------------------------------------
memcpy(data, dwordWrapper);
write("Dword as bytes: %#lx %#lx %#lx %#lx", data[0], data[1], data[2],
data[3]);

내가 이 함수를 사용한 이유...

진단통신의 시큐리티 엑세스 시 2바이트의 시드를 받은 뒤 키를 생성해낸 키 값을 word형태로 표현하려 하니
basic diagnostics 패널의 파라메터와 연동이 잘 되지 않아서 2개의 바이트로 쪼개기 위해 memcpy를 사용함

사례는 아래와 같음

void fn_CalSeed (byte Seed_HiByte, byte Seed_LoByte)
{
    word KeyValue;   //valuable for key calculating
    byte keyVal[2];   //valuable for key that has calculated is containing

    struct sKeyvalue //valuable for key calculating
    {
        word dw;
    }wordsKeyvalue;
   
    KeyValue = _________________; //key-making-fomular (생략)

    wordsKeyvalue.dw = swapword(KeyValue); //바이트 스왑을 해줘야 순서 안꼬임
    memcpy(keyVal,wordsKeyvalue);          //memcpy를 통해 struct의 값을 byte 배열 변수로 입력


    write("Seed1:%02X, Seed2:%02X, Key1:%02X, Key2:%02X",Seed_HiByte,Seed_LoByte,keyVal[0], keyVal[1]);


    SecurityAccess_SendKey_EOL_Req.SetParameter("keyVal1",keyVal[0]);
    SecurityAccess_SendKey_EOL_Req.SetParameter("keyVal2",keyVal[1]);
    SecurityAccess_SendKey_EOL_Req.SendRequest();
}