перевести беззнаковый символ c ++ в c# - PullRequest
0 голосов
/ 17 января 2020

Могу ли я получить помощь, чтобы перевести этот код C ++ в c#?

auto tmp2 = new unsigned char[tmp1 + 1];
auto tmp3 = (DWORD)tmp2;
std::cout << "tmp3: " << std::hex << tmp3 << std::endl;

Значение tmp1 равно 0xBC3000, tmp3 равно 0x1276040

Это то, что у меня сейчас есть:

var tmp2 = new byte[tmp1 + 1];
//tmp3 ???
MessageBox.Show("tmp3 : " + tmp3.ToString());

1 Ответ

0 голосов
/ 17 января 2020

Короткий ответ таков: это отчасти возможно, но вы действительно не должны.

C ++ широко использует указатели, в то время как C# избегает их в коде пользователя в максимально возможной степени. Несмотря на то, что с указателями можно работать, он не одобряется при выполнении большинства операций, кроме взаимодействия. Даже тогда более распространенным является использование. NET сортировки для абстракции фактических указателей.

Как уже упоминалось в различных комментариях по этому вопросу, ссылочные типы C# в принципе можно перемещать в любое время. На практике этого не происходит, но это допустимо, и нет никаких гарантий, что это не произойдет в будущем.

Что еще хуже, строки инвариантны. Вместо того, чтобы выделять буфер и заполнять его символами, как в C ++, у вас есть строковая ссылка, которая меняется всякий раз, когда вы меняете его содержимое. Даже если бы вы могли получить адрес одного экземпляра строки, этот адрес был бы недействительным при изменении строки. Вместо этого вы можете использовать StringBuilder, но адрес внутреннего массива почти всегда меняется при изменении его размера.

Моя проблема в том, что мне нужен tmp3 в моей программе

Кажется, в этом суть проблемы. Пока вы думаете , что вам нужен tmp3 в вашей программе, вы, вероятно, этого не делаете. Все зависит от того, что с этим делается. Без дополнительной информации о том, что вы делаете с этим, мы не сможем вам помочь.

Итак ... почему вам нужно использовать tmp3 в вашей программе?

...