ورود

View Full Version : حرفه ای: تبدیل تکه کد C# به C++



r0ot$harp
چهارشنبه 16 فروردین 1391, 08:43 صبح
سلام دوستان عزیز

یه قسمتی از کد C#‎ هست می خوام تبدیل کنم به C++‎.ممنون می شم بهم بگین مشکل کارم چیه ؟؟؟

کد C#‎:
public class ehauusia
{
public byte[] Buffer = new byte[8];
public uint BufLen;
public byte[] ver = new byte[8];
public const int LEN = 8;
public const int KEY = 0x20; //32
public const int b9 = 0x10; //16
public const int KEY_LEN = 8;
public const int b6 = 8;
public const int t4= 0x60; //96
public const int KEY_LEN12 = 0x18; //24
public byte[] a2 = new byte[8];
public uint a1;
public uint ds;
public uint[] fg = new uint[0x60]; //96
}

کد C++‎:
typedef struct tagehauusia
{
byte Buffer[8];
unsigned int BufLen;
byte ver[8];
static const int LEN = 8;
static const int KEY = 0x20;
static const int b9 = 0x10;
static const int KEY_LEN = 8;
static const int b6 = 8;
static const int t4 = 0x60;
static const int KEY_LEN12 = 0x18;
byte a2[8];
unsigned int a1;
unsigned int ds;
unsigned int fg[0x60];
}ehauusia;

باتشکر احسان

mehdi.mousavi
شنبه 19 فروردین 1391, 16:22 عصر
سلام.
من مشکلی در کد شما نمی بینم، شاید مشکل در نحوه استفاده از اون Struct باشه:

typedef struct _EHAUUSIA {
BYTE Buffer[8];
UINT BufLen;
byte ver[8];
static const INT LEN = 8;
static const INT KEY = 0x20;
static const INT b9 = 0x10;
static const INT KEY_LEN = 8;
static const INT b6 = 8;
static const INT t4 = 0x60;
static const INT KEY_LEN12 = 0x18;
byte a2[8];
UINT a1;
UINT ds;
UINT fg[0x60];
} EHAUUSIA;

int _tmain(int argc, _TCHAR* argv[])
{
EHAUUSIA st = { NULL };
int length = st.LEN;
st.a1 = 34;

return 0;
}


در هر حال، اگر ایرادی که باهاش مواجه میشید رو بفرمایید چی هستش، شاید بهتر بتونم کمک کنم.

موفق باشید.

r0ot$harp
چهارشنبه 23 فروردین 1391, 08:15 صبح
تشکر جناب موسوی.

یه سول دیگه:
Encoding.ASCII.GetBytes می خواستم بدونم معادل این کد در C++ چیه؟؟؟

باتشکر احسان

mehdi.mousavi
چهارشنبه 23 فروردین 1391, 10:45 صبح
تشکر جناب موسوی. یه سول دیگه: Encoding.ASCII.GetBytes می خواستم بدونم معادل این کد در C++ چیه؟؟؟ باتشکر احسان

سلام.
اگر هدفتون تبدیل یک String به Byte Array هستش و String شما، یک ANSI String هستش، میتونید بدین شکل عمل کنید:


CStringA str(_T("JUST A SIMPLE STRING"));
LPCSTR bytes = str.GetString();

//bytes[0] == 'J'
//bytes[1] == 'U'
//bytes[2] == 'S'
//...


اینجا، متود GetString از کلاس CStringA به شما Pointer ای به Byte Array ای میده که به ترتیب خونه های صفر، یک و ... ی اون، بیانگر رشته ورودی هستش (همون کاری که Encoding.ASCII.GetBytes در C# میکنه). اما اگر رشته ورودی Wide Char باشه، باید از تابع WideCharToMultiByte (http://msdn.microsoft.com/en-us/library/dd374130%28VS.85%29.aspx) استفاده کنید تا Conversion بدرستی صورت بگیره.

موفق باشید.

r0ot$harp
چهارشنبه 23 فروردین 1391, 15:58 عصر
آقا واقعا ممنون.

اما یه مشکلی دارم. دیگه تاپیک باز نمی کنم.

من یه رشته ای دارم که شامل حروف اسکی ناخانا هست مثل &^@)#_!(@)! و ... می خوام کاری کنم این حروف تبدیل به حرف و عدد فقط بشه که بتونیم اون رو راحت بخونیم.

تنها راهی که می دونم می شه ازش استفاده کرد ASCII TO BCD هست.


دو سوال دیگه هم دارم:
1) یک تابع دارم که می خوام یک رشته رو برگردونه. این رو بگم این تابع داخل یک DLL هست. می خوام به C# یا هر زبان دیگه ای که از این DLL استفاده می کنم رشته برگردونه. آخرین قسمت این تابع یک تابع دیگه ای هست که خروجی این تابع که std::string باید در این تابع برگشت داده بشه. نمی دونم نوع این تابه رو وقتی روی std::string می زارم ایراد می گیره.

2) یک تابع دیگه هم دارم که می خوام byte[512] رو به رشته برگردونه. این تابع رو هم نمی دونم نوعش رو از چی بزارم.
از کد زیر که استفاده می کنم خطا می ده:
byte a[512];
char *s= (char*)a;
s متغیری هست که باید به رشته برگرده. نوع تابع رو هم روی LPCSTR گذاشتم.

ممنون می شم یه راهی بگین.

باتشکر احسان

mehdi.mousavi
شنبه 26 فروردین 1391, 12:22 عصر
سلام.
سمت C++‎، مقدار بازگشتی تابع رو char * بذارید و سمت C#‎، مقدار بازگشتی رو IntPtr تعریف کنید. سپس با استفاده از Marshal.PtrToStringAnsi اون IntPtr رو (که با فراخوانی C++‎ Function بدست آورده اید)، به ANSI String تبدیل کنید و نتسجه رو در یک string بریزید. در هر حال، اگر مشکلتون با این توضیح حل نشد، لطفا چند خط کد بذارید (تابع C++‎ و همینطور تابع C#‎ اتون رو) تا متوجه بشم چطوری دارید مساله رو حل می کنید.

موفق باشید.

r0ot$harp
شنبه 26 فروردین 1391, 16:06 عصر
سلام.
سمت C++‎‎، مقدار بازگشتی تابع رو char * بذارید و سمت C#‎‎، مقدار بازگشتی رو IntPtr تعریف کنید. سپس با استفاده از Marshal.PtrToStringAnsi اون IntPtr رو (که با فراخوانی C++‎‎ Function بدست آورده اید)، به ANSI String تبدیل کنید و نتسجه رو در یک string بریزید. در هر حال، اگر مشکلتون با این توضیح حل نشد، لطفا چند خط کد بذارید (تابع C++‎‎ و همینطور تابع C#‎‎ اتون رو) تا متوجه بشم چطوری دارید مساله رو حل می کنید.

موفق باشید.

سلام.

آقا ممنون بابت پاسختون.
تو این مدت مشکل رو درست کردم.
الان تنها یک مشکل دارم. قسمتی از برنامه باید مانند بالا یک رشته ای که در متغیر byte p[0x200]; ذخیره شده است برگشت بدم. نوع تابع char* هست. و زمانی که می خوام متغیر p رو برگردونم با خطای زیر مواجه می شم.

'return' : cannot convert from 'byte [512]' to 'char *'

متغیر p حتما باید از نوع byte p[0x200]; باشه. چون اگر تغییر بدم بیش از 100 قسمت از برنامه باید تغییر کنه.

البته من راهی براش پیدا کردم. اما چون این کد باید روی Chip ARM9 کامپایل بشه میخوام بدونم آیا این قسمت درست پیاده سازی شده یا راه بهتری هست.

char *temp = (char*)malloc(512);
memcpy(temp,p,512);

باتشکر احسان

lyalestany
سه شنبه 13 تیر 1391, 08:52 صبح
سلام

من خودم با C# کار میکنم و تازه بنا به کاری که برام پیش اومده رفتم سراغ c . با توجه به چیز های که فهمیدم گمان میکنم مشکل در این است که آرایه ای که در سی شارپ تعریف میشه مثلا با طول 8 اگر در سی تعریف شود باید با طول 9 تعریف شود تا بتواند همان 8 مقدار را بگیرد. چون در سی همیشه یک خانه آرایه برای نشان دادن پایان آرایه مورد استفاده قرار می گیرد.

البته گفتم در سی تازه کارم و شاید اشتباه کنم.