PDA

View Full Version : آموزش: کلاس کمکی Write یک ویا چند بایت داده در یک آرایه چند بایتی



farhad_shiri_ex
چهارشنبه 04 اردیبهشت 1398, 20:00 عصر
تصور کنید یک داده چندبایتی دارید وقصد دارید که یک بایت مشخص ویا چند بایت مشخص پشت سرهم در داده مورد نظر را با داده های جدید جایگزین نمایید برای اینکار از کلاس کمکی زیر استفاده نمایید.
در صورت لازم بفرمایید توضیحات تکمیلتر ارائه کنم.

#ifndef BYTEHELPER_H_
#define BYTEHELPER_H_


#define WRITE_BYTE(type,arg1,arg2) \
ByteHelper::getInstance()->write_Byte<type>(arg1,arg2)
#define WRITE_BYTES(arg1,arg2) \
ByteHelper::getInstance()->write_Bytes(arg1,arg2)
#define WRITE_BYTES2(arg1,arg2,arg3) \
ByteHelper::getInstance()->write_Bytes(arg1,arg2,arg3)
#define WRITE_BYTES_COPY(type,arg1,arg2,arg3,arg4) \
ByteHelper::getInstance()->write_Bytes_Copy<type>(arg1,arg2,arg3,arg4)
#define WRITE_BYTES_COPY2(type,arg1,arg2) \
ByteHelper::getInstance()->write_Bytes_Copy<type>(arg1,arg2)
#define CLEAR_BYTES(arg1) \
ByteHelper::getInstance()->clear_Bytes(arg1)


#include "MyException.h"
#include <string.h>


class ByteHelper {
public:
~ByteHelper() {
}


//static ctor
inline static ByteHelper* getInstance() {
static ByteHelper* bf = new ByteHelper;
return bf;
}


template<typename _R,size_t N>
inline void* clear_Bytes(_R(&ref)[N], size_t size = 0) {
return memset(ref, 0, size > 0 ? size : sizeof(ref));
}


template<typename _CAST_TYPE, typename _R, typename _T>
inline bool write_Byte(_R* const ref, const _T& value) {
try {
*((_CAST_TYPE) ref) = value;
} catch (MyException& E) {
return false;
}
return true;
}


template<typename _CAST_TYPE, typename _R, typename _T, size_t N>
inline bool convert_Byte(_R(&ref)[N], _T* value) {
try {
ref = *(reinterpret_cast<_CAST_TYPE> (value[0]));
} catch (MyException& E) {
return false;
}
return true;
}


template<typename _R, typename _T,size_t N>
inline bool write_Bytes(_R(&ref)[N] /*_R* const ref*/, const _T& value, size_t size = 0) {
try {
memcpy(ref, value, size > 0 ? size : strlen((pbyte)value)/*sizeof(value)*/);
} catch (MyException& E) {
return false;
}
return true;
}


template<typename _CAST_TYPE, typename _R, typename _T>
inline bool write_Bytes_Copy(_R* const ref, const _T& value,int fristOffset =0 , int endOffset =0) {
try {
int tmp_size = endOffset > 0 ? endOffset : sizeof(value);
std::copy(value + fristOffset, value + tmp_size, (_CAST_TYPE) ref);
} catch (MyException& E) {
return false;
}
return true;
}


private:
//defined private ctor! because can not create object.
//must be create object calling static factory method getInstance();
ByteHelper() {
} //Default ctor


ByteHelper(ByteHelper&) {
}//Copy ctor


ByteHelper& operator=(ByteHelper&) {
return *this;
}//Copy Assignment operator
int a;
};


#endif /* BYTEHELPER_H_ */