C# vs C++ xor
От: codenet Россия  
Дата: 26.05.13 04:05
Оценка: :)
Добрый день

то ли лыжи не едут, толи бессонные ночи...
в общем есть код на с++

byte* rx={0};      
int dynsize=20;
rx = (byte *)realloc(rx, dynsize);
memset(rx,0x00,dynsize);
memcpy(rx,(byte *)"Alex",4);
int p = 0;  
while (p < dynsize)
        rx[p++] ^= ((p % 2 >0) ? rx[(p > 1 ? p - 1 : 0)] : (byte)0x00);


на выходе я получу

rx[0]
65 'A'
rx[1]
45 '-'
rx[2]
101 'e'
rx[3]
29 '\x1d'



Есть код на C#


 int p = 0;
 int dynsize = 20;
 byte[] rx = new byte[dynsize];
 Array.Copy(Encoding.Default.GetBytes("Alex"), 0, rx, 0, 4);
 while (p < dynsize)
       rx[p++] ^= ((p % 2 >0) ? rx[(p > 1 ? p - 1 : 0)] : (byte)0x00);


на выходе я получу

rx
{byte[20]}
    [0]: 0
    [1]: 108
    [2]: 0
    [3]: 120
    [4]: 0
    [5]: 0


в чем отличие =\ ? ,ведь по факту в массивах размещено слово Alex как на с++ так и на шарпе...
почему в случае с C# получаю через 1 нули ,а на с++ нечто иное


заранее спасибо за ответы.
xor c++ c#
Re: C# vs C++ xor
От: Аноним  
Дата: 26.05.13 05:02
Оценка:
Здравствуйте, codenet, Вы писали:

C> while (p < dynsize)
C>       rx[p++] ^= ((p % 2 >0) ? rx[(p > 1 ? p - 1 : 0)] : (byte)0x00);

заменить на
while (p < dynsize)
{
    rx[p] ^= ((p % 2 > 0) ? rx[(p > 1 ? p - 1 : 0)] : (byte)0x00);
    p++;
}
Re: C# vs C++ xor
От: LaptevVV Россия  
Дата: 26.05.13 05:04
Оценка:
Здравствуйте, codenet, Вы писали:

C>Добрый день :)


C>то ли лыжи не едут, толи бессонные ночи...

C>в общем есть код на с++

C>
C>byte* rx={0};      
C>int dynsize=20;
C>rx = (byte *)realloc(rx, dynsize);
C>memset(rx,0x00,dynsize);
C>memcpy(rx,(byte *)"Alex",4);
C>int p = 0;  
C>while (p < dynsize)
C>        rx[p++] ^= ((p % 2 >0) ? rx[(p > 1 ? p - 1 : 0)] : (byte)0x00);
C>


C>на выходе я получу


C>
C>rx[0]
C>65 'A'
C>rx[1]
C>45 '-'
C>rx[2]
C>101 'e'
C>rx[3]
C>29 '\x1d'

C>



C>Есть код на C#



C>
C> int p = 0;
C> int dynsize = 20;
C> byte[] rx = new byte[dynsize];
C> Array.Copy(Encoding.Default.GetBytes("Alex"), 0, rx, 0, 4);
C> while (p < dynsize)
C>       rx[p++] ^= ((p % 2 >0) ? rx[(p > 1 ? p - 1 : 0)] : (byte)0x00);
                    
C>


C>на выходе я получу


C>
C>rx
C>{byte[20]}
C>    [0]: 0
C>    [1]: 108
C>    [2]: 0
C>    [3]: 120
C>    [4]: 0
C>    [5]: 0
C>


C>в чем отличие =\ ? ,ведь по факту в массивах размещено слово Alex как на с++ так и на шарпе...

C>почему в случае с C# получаю через 1 нули ,а на с++ нечто иное :crash:

Ваш byte на C++ — наверное char ?
Размеры одного символа разве одинаковы?
Константа в C# разве не в юникоде?
Вы в каких средах работаете?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: C# vs C++ xor
От: codenet Россия  
Дата: 26.05.13 05:09
Оценка:
Здравствуйте, codenet, Вы писали:

а так код на C#

 while (p < dynsize)
            {
                if(p % 2 >0)
                rx[p] =(byte)(rx[p] ^ rx[(p > 1 ? p - 1 : 0)]);
                else
                    rx[p]= (byte)(rx[p] ^ 0x00);
                p++;
            }

отработает как и с++.
где же я пролетел ?
Re[2]: C# vs C++ xor
От: codenet Россия  
Дата: 26.05.13 05:11
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, codenet, Вы писали:


C>>Добрый день


C>>то ли лыжи не едут, толи бессонные ночи...

C>>в общем есть код на с++

C>>
C>>byte* rx={0};      
C>>int dynsize=20;
C>>rx = (byte *)realloc(rx, dynsize);
C>>memset(rx,0x00,dynsize);
C>>memcpy(rx,(byte *)"Alex",4);
C>>int p = 0;  
C>>while (p < dynsize)
C>>        rx[p++] ^= ((p % 2 >0) ? rx[(p > 1 ? p - 1 : 0)] : (byte)0x00);
C>>


C>>на выходе я получу


C>>
C>>rx[0]
C>>65 'A'
C>>rx[1]
C>>45 '-'
C>>rx[2]
C>>101 'e'
C>>rx[3]
C>>29 '\x1d'

C>>



C>>Есть код на C#



C>>
C>> int p = 0;
C>> int dynsize = 20;
C>> byte[] rx = new byte[dynsize];
C>> Array.Copy(Encoding.Default.GetBytes("Alex"), 0, rx, 0, 4);
C>> while (p < dynsize)
C>>       rx[p++] ^= ((p % 2 >0) ? rx[(p > 1 ? p - 1 : 0)] : (byte)0x00);
                    
C>>


C>>на выходе я получу


C>>
C>>rx
C>>{byte[20]}
C>>    [0]: 0
C>>    [1]: 108
C>>    [2]: 0
C>>    [3]: 120
C>>    [4]: 0
C>>    [5]: 0
C>>


C>>в чем отличие =\ ? ,ведь по факту в массивах размещено слово Alex как на с++ так и на шарпе...

C>>почему в случае с C# получаю через 1 нули ,а на с++ нечто иное

LVV>Ваш byte на C++ — наверное char ?

LVV>Размеры одного символа разве одинаковы?
LVV>Константа в C# разве не в юникоде?
LVV>Вы в каких средах работаете?

1)нет,byte
2)да
3)проблема как я понимаю не в этом...
4)VS2012



 while (p < dynsize)
            {
                if(p % 2 >0)
                rx[p] =(byte)(rx[p] ^ rx[(p > 1 ? p - 1 : 0)]);
                else
                    rx[p]= (byte)(rx[p] ^ 0x00);
                p++;
            }

отработал правильно на шарпе
Re[2]: C# vs C++ xor
От: Аноним  
Дата: 26.05.13 05:12
Оценка:
Здравствуйте, codenet, Вы писали:
C>где же я пролетел ?
В строке
rx[p++] ^= ((p % 2 >0) ? rx[(p > 1 ? p - 1 : 0)] : (byte)0x00);

p++ случается раньше, чем вычисление левой части присваивания
Re[2]: C# vs C++ xor
От: codenet Россия  
Дата: 26.05.13 05:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, codenet, Вы писали:


А>
C>> while (p < dynsize)
C>>       rx[p++] ^= ((p % 2 >0) ? rx[(p > 1 ? p - 1 : 0)] : (byte)0x00);
А>

А>заменить на
А>
А>while (p < dynsize)
А>{
А>    rx[p] ^= ((p % 2 > 0) ? rx[(p > 1 ? p - 1 : 0)] : (byte)0x00);
А>    p++;
А>}

Спасибо аноним,но всё же интересно почему так произошло...
при одной и той-же последовательности...там и там по правилам первый проход переменная p должна считаться как 0 а далее инкремениться...
Re[3]: C# vs C++ xor
От: Аноним  
Дата: 26.05.13 05:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>p++ случается раньше, чем вычисление правой части присваивания
Re[3]: C# vs C++ xor
От: Аноним  
Дата: 26.05.13 05:22
Оценка:
Здравствуйте, codenet, Вы писали:
C>при одной и той-же последовательности...там и там по правилам первый проход переменная p должна считаться как 0 а далее инкремениться...
С том то и дело, что rx[p++] = ... гарантирует, результат запишется в rx[p+1], но не гарантирует, что операция p++ выполниться после всего выражения — это зависит от конкретного компилятора. Компилятор С++ вычислил p++ после присваивания, а компилятор C# посчитал нужным выполнить инкремент сразу после того, как запомнил, что результат нужно будет сохранить в rx[p].
Re[4]: C# vs C++ xor
От: Аноним  
Дата: 26.05.13 05:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, codenet, Вы писали:

C>>при одной и той-же последовательности...там и там по правилам первый проход переменная p должна считаться как 0 а далее инкремениться...
А>С том то и дело, что rx[p++] = ... гарантирует, результат запишется в rx[p+1], но не гарантирует, что операция p++ выполниться после всего выражения — это зависит от конкретного компилятора. Компилятор С++ вычислил p++ после присваивания, а компилятор C# посчитал нужным выполнить инкремент сразу после того, как запомнил, что результат нужно будет сохранить в rx[p+1].
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.