С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 12.07.2015
Сообщений: 8
1

Что делает метод?

02.01.2020, 12:54. Показов 3030. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Подскажите пожалуйста, как будет выглядеть данный фрагмент кода на C#.
C++
1
2
3
4
5
6
7
std::string StrUtils::pad_with_number(const std::string & str, unsigned int num)
{
    std::string res(4, 0);
    res.append(str);
    *reinterpret_cast<unsigned int*>(&res[0]) = num;
    return res;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.01.2020, 12:54
Ответы с готовыми решениями:

Что это за метод?И что он делает?
double func (double y, int k, int n){ double y1; for (int i=0; i&lt;=n+1;i++) y1=0; ...

Что делает метод cin.ignore?
cin.ignore(0,'\n'); Что она делает?

что делает эта программа распишите пожалуйста? это ведь метод прогонки?
что делает эта программа распишите пожалуйста? это ведь метод прогонки? #include &lt;cstdio&gt;...

Не могу понять на что способен sort, и что делает его компаратор
Недавно мой знакомый рассказывал что-то про sort,говорил что с помощью него можно сортировать как...

13
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
02.01.2020, 15:06 2
Лучший ответ Сообщение было отмечено Mars1c как решение

Решение

Мне говорили что если код доходит до reinterpret_cast тогда вы что то делаете не правильно
В данном случае мы битовую маску строки представляем как unsigned int* и меняем её на битовую маску num

На С# без Unsafe этого вроде нельзя сделать

Пример: мы запихнём строку example и unsigned int 1 094 795 585‬
(В бинарном виде этот unsigned int)

Код
01000001 01000001 01000001 01000001‬
Если разделить эту маску по байтам, получится что каждый байт будет соответствовать символу 'A'
На выходе будет
AAAAexample

Вроде(не проверял)
1
0 / 0 / 0
Регистрация: 12.07.2015
Сообщений: 8
02.01.2020, 15:20  [ТС] 3
AndryS1, не подскажете, что значит эта строка
C++
1
std::string res(4, 0);
? (я очень далёк от C++)
0
фрилансер
5848 / 5379 / 1103
Регистрация: 11.10.2019
Сообщений: 14,380
02.01.2020, 15:30 4
Mars1c, в этой строке должно быть в данном случае
C++
1
std::string res(sizeof(unsigned int*), '\0');
выделение внутреннего буфера под указанное количество элементов, инициализация их нулями
1
85 / 34 / 20
Регистрация: 15.12.2019
Сообщений: 88
02.01.2020, 15:31 5
Цитата Сообщение от Mars1c Посмотреть сообщение
AndryS1, не подскажете, что значит эта строка
C++
1
std::string res(4, 0);
? (я очень далёк от C++)
Мне тоже было бы интересно узнать, учитывая то, что в классе string нет такого конструктора.

C++
1
2
3
4
    String(char* _str = "");
    String(const String&);
 
    ~String();
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
02.01.2020, 15:37 6
Алексей1153, может быть sizeof все-таки не от указателя нужен? )

Цитата Сообщение от nyaka_wai Посмотреть сообщение
учитывая то, что в классе string нет такого конструктора.
Есть же )
0
фрилансер
5848 / 5379 / 1103
Регистрация: 11.10.2019
Сообщений: 14,380
02.01.2020, 15:39 7
Цитата Сообщение от DrOffset Посмотреть сообщение
может быть sizeof все-таки не от указателя нужен
это да, погорячился

а ещё лучше sizeof(num)
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
02.01.2020, 15:50 8
Цитата Сообщение от nyaka_wai Посмотреть сообщение
AndryS1, не подскажете, что значит эта строка
Это заполнение строки 4-мя символами NULL

Цитата Сообщение от nyaka_wai Посмотреть сообщение
Мне тоже было бы интересно узнать, учитывая то, что в классе string нет такого конструктора.
Мда?) А так?) std::string(4,'4');
0
85 / 34 / 20
Регистрация: 15.12.2019
Сообщений: 88
02.01.2020, 15:59 9
Цитата Сообщение от AndryS1 Посмотреть сообщение
ЭМда?) А так?) std::string(4,'4');
Наверное я просто не по той библиотеке посмотрел документацию) string.h, а не string

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#ifndef STRING_H
#define STRING_H
 
#include <iostream>
 
namespace STD
{
 
int StrLen(char*);
void StrCpy(char*, char*);
bool StrCmp(char*, char*);
 
class String
{
public:
    String(char* _str = "");
    String(const String&);
 
    ~String();
 
    String& operator=(const String&);
    friend String operator+(const String&, const String&);
    String& operator+=(const String&);
 
    friend bool operator==(const String&, const String&);
    friend bool operator!=(const String&, const String&);
    friend bool operator>(const String&, const String&);
    friend bool operator>=(const String&, const String&);
    friend bool operator<(const String&, const String&);
    friend bool operator<=(const String&, const String&);
 
    const char& operator[](int) const;
    char& operator[](int);
 
    friend std::ostream& operator<<(std::ostream&, const String&);
    friend std::istream& operator>>(std::istream&, String&);
 
private:
    char* str;
};
 
String::String(char* _str)
{
    str = new char[StrLen(_str)+1];
    StrCpy(str, _str);
}
 
String::String(const String& rhs)
{
    str = new char[StrLen(rhs.str)+1];
    StrCpy(str, rhs.str);
}
 
String::~String()
{
    delete str;
}
 
// ---
 
String& String::operator=(const String& rhs)
{
    if (this != &rhs)
    {
        delete[] this->str;
        this->str = new char[StrLen(rhs.str)+1];
        StrCpy(this->str, rhs.str);
    }
 
    return *this;
}
 
String& String::operator+=(const String& rhs)
{
    int sz = StrLen(this->str) + StrLen(rhs.str);
 
    char* ts = new char[sz+1];
 
    for (int i = 0; i < StrLen(this->str); i++)
        ts[i] = this->str[i];
    for (int ii = StrLen(this->str), j = 0; ii <= sz; ii++, j++)
        ts[ii] = rhs.str[j];
 
    delete this->str;
    this->str = ts;
 
    return *this;
}
 
String operator+(const String& lhs, const String& rhs)
{
    String ts = lhs;
 
    return ts += rhs;
}
 
// --
 
bool operator==(const String& lhs, const String& rhs)
{
    return StrCmp(lhs.str, rhs.str);
}
 
bool operator!=(const String& lhs, const String& rhs)
{
    return !(StrCmp(lhs.str, rhs.str));
}
 
bool operator>(const String& lhs, const String& rhs)
{
    return (StrLen(lhs.str) > StrLen(rhs.str)) ? true : false;
}
 
bool operator>=(const String& lhs, const String& rhs)
{
    return (StrLen(lhs.str) >= StrLen(rhs.str)) ? true : false;
}
 
bool operator<(const String& lhs, const String& rhs)
{
    return (StrLen(lhs.str) < StrLen(rhs.str)) ? true : false;
}
 
bool operator<=(const String& lhs, const String& rhs)
{
    return (StrLen(lhs.str) <= StrLen(rhs.str)) ? true : false;
}
 
// ---
 
const char& String::operator[](int i) const
{
    //std::cerr << "Index out of range. \n";
    return (i >= 0 && i < StrLen(this->str)) ? this->str[i] : 0;
}
 
char& String::operator[](int i)
{
    static char DUMMY; DUMMY = '';
    //std::cerr << "Index out of range. \n";
    return (i >= 0 && i < StrLen(this->str)) ? this->str[i] : DUMMY;
}
 
// ---
 
std::ostream& operator<<(std::ostream& os, const String& obj)
{
    return os << obj.str;
}
 
std::istream& operator>>(std::istream& is, String& obj)
{
    char BUFF[2048];
 
    is.getline(BUFF, sizeof BUFF);
    obj = BUFF;
 
    return is;
}
 
// ---
 
int StrLen(char* _str)
{
    int size = 0;
 
    for (; _str[size] != 0; size++);
 
    return size;
}
 
void StrCpy(char* in_str, char* src_str)
{
    for (int i = 0; i < StrLen(in_str); i++)
        in_str[i] = src_str[i];
}
 
bool StrCmp(char* str_f, char* str_s)
{
    int i = 0;
 
    for (; str_f[i] == str_s[i] && i < StrLen(str_f); i++);
 
    return (i == StrLen(str_f)) ? true : false;
}
 
}
 
#endif
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
02.01.2020, 16:07 10
Лучший ответ Сообщение было отмечено Mars1c как решение

Решение

Цитата Сообщение от Mars1c Посмотреть сообщение
на C#.
Цитата Сообщение от Mars1c Посмотреть сообщение
C++
1
*reinterpret_cast<unsigned int*>(&res[0]) = num;
Я думаю, что процитированное можно спокойно заменить на
C#
1
BitConverter.GetBytes(num);

Видимо что-то такое должно получиться:
C#
1
2
3
4
5
6
7
8
9
        public static byte[] pad_with_number(string str, Int32 num)
        {
            byte[] numBytes = BitConverter.GetBytes(num);
            byte[] strBytes = ASCIIEncoding.ASCII.GetBytes(str);
            byte[] ret = new byte[numBytes.Length + strBytes.Length];
            Buffer.BlockCopy(numBytes, 0, ret, 0, numBytes.Length);
            Buffer.BlockCopy(strBytes, 0, ret, numBytes.Length, strBytes.Length);
            return ret;
        }
https://rextester.com/VBR89253

Добавлено через 5 минут
ASCIIEncoding можно заменить UTF8Encoding или другие подходящие (в зависимости от того, что в С++ предполагалось хранить в str)
1
0 / 0 / 0
Регистрация: 12.07.2015
Сообщений: 8
02.01.2020, 16:47  [ТС] 11
DrOffset, спасибо огромное!

Добавлено через 38 минут
DrOffset, Вы мне очень помогли. Если не составит труда, скажите пожалуйста, как этот блок кода будет выглядеть в C#. В общих чертах я понимаю, что pad_size раз добавляет символ 0x01, но как такая конструкция if может выглядеть в C#.
C++
1
2
3
4
5
6
std::size_t pad_size = 0;
    if (enc_size & 0xF)
    {
        pad_size = 0x10 - (enc_size & 0xF);
    }
    enc_inner.append(pad_size, 0x01); // Padding
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
02.01.2020, 16:58 12
Mars1c, что такое enc_inner?
0
0 / 0 / 0
Регистрация: 12.07.2015
Сообщений: 8
02.01.2020, 17:00  [ТС] 13
DrOffset, enc_inner, это кодированная строка.
C++
1
std::size_t enc_size = enc_inner.size() + before_crypt.size();
enc_size (length) сумма длин строк, если я правильно понимаю.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
02.01.2020, 17:00 14
Лучший ответ Сообщение было отмечено Mars1c как решение

Решение

Цитата Сообщение от Mars1c Посмотреть сообщение
как такая конструкция if может выглядеть в C#.
Да точно также практически.

C++
1
2
3
4
5
6
            
UInt64 pad_size = 0;
if ((enc_size & 0xF) != 0)
{
    pad_size = 0x10 - (enc_size & 0xF);
}
1
02.01.2020, 17:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.01.2020, 17:00
Помогаю со студенческими работами здесь

Что в программе делает так, что процессор грузится на 100%?
Я не очень разбираюсь в С++, поэтому прошу вашей подсказки по поводу нагрузки на процессор. Вот...

Я не могу понять что делает данная программа. Точнее что делают функции используемые в это коде
#include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;ctime&gt; using namespace std; int g(int a, int...

Что это за знак >> прочитал что это сдвиг вправо? что он делает
int d=6, c=5,f; f = d &gt;&gt; c; cout&lt;&lt; f; вывод 0

что этот метод делает , что значит ?
protected void getImageDimensions() { width = image.getWidth(null); height =...

Что делает метод потокобезопасным?
Я гуглил, но довольно часто встречается разнородная информация из которой трудно получить...

Что делает метод ToString()?
Что делает метод ToString()?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru