Я написал функцию для вычисления контрольной суммы на двух разных языках программирования. В c и c#. Но я получаю разные результаты с обеих сторон. программа, написанная на c, дает правильный результат. Но программа, написанная на c#, дает неожиданный результат.

Код C

uint16_t findOnesComplement (uint16_t data)       {
    return ~data;
}

uint16_t findTwosComplement (uint16_t data)       {
    return (findOnesComplement(data) + 1);
}

uint8_t calculateCheckSum (uint8_t* data, uint8_t dataLen)                {
    uint16_t sum = '1' + '1' + 'V' + '1' + '?';
    uint16_t val = 0x00;

    val = findTwosComplement(sum);

    return (((val & 0xFF) & 0x7F) | 0x40);

}

Возвращает результат как 0x58. Что правильно.

Код C #

    public UInt16 findOnesComplement(UInt16 data)        {
        return (UInt16)~data;
    }

    public UInt16 findTwosComplement(UInt16 data)        {
        return (UInt16)(findOnesComplement(data) + 1);
    }

    public byte calculateCheckSum()        {
        UInt16 sum = '1' + '1' + 'V' + '1' + '?';
        UInt16 val = 0;
        byte retVal = 0;

        val = findTwosComplement(sum);
        retVal = (byte)(((val & 0xFF) & 0x7F) | 0x40);
        return retVal;
    }

дает результат как 0x88. Я не ожидал этого.

ИЗМЕНИТЬ

    public int calculateCheckSum()        {
        Encoding ascii = Encoding.ASCII;
        string str = "11V1?";
        int sum = 0;
        Byte[] encodedBytes = ascii.GetBytes(str);
        foreach (Byte b in encodedBytes)
        {
            Console.Write("[{0}]", b);
            sum += b;

        }
        int val = 0;

        val = findTwosComplement(sum);
        return  (((val & 0xFF) & 0x7F) | 0x40);
    }

Немного отредактировали код, чтобы убедиться, что все написано в формате ascii, а оператор return является выражением, аналогичным c в соответствии с комментариями.

вернуть 88, что неверно.

Какие-либо предложения?

c# c
1
Devjeet Mandal 22 Июл 2020 в 13:42
9
Вы пытались его отладить? На каком этапе C# начинает давать промежуточные результаты, отличные от C?
 – 
canton7
22 Июл 2020 в 13:45
1
Вы уверены, что программа C# использует кодировку ASCII для всех своих символов и что добавление символов в C# просто добавляет значения в кодировке ASCII, как это происходит в C?
 – 
Some programmer dude
22 Июл 2020 в 13:45
6
Я запустил код С# и получил ответ: 88 десятичное = 0x58. Вы правильно печатаете вывод в шестнадцатеричном формате?
 – 
Rup
22 Июл 2020 в 14:06
3
Пришло время создать правильный минимально воспроизводимый пример, который включает фактический вызов calculateCheckSum и то, как вы распечатать или сообщить результат. Также, пожалуйста, найдите время, чтобы прочитать страницы справки, возьмите SO обзор, прочитайте Как спросить, а также этот контрольный список вопросов.
 – 
Some programmer dude
22 Июл 2020 в 14:09
1
Спасибо. Я печатал десятичный и ожидал шестнадцатеричный. Извиняюсь.
 – 
Devjeet Mandal
22 Июл 2020 в 14:09

1 ответ

Лучший ответ

Я получаю 0x58 (это 88 десятичных знаков) для обоих

Сумма = 296 (49 * 3 + 86 + 63) = 296 = 0000 0001 0010 1000

Дополнение до двух = 1111 1110 1101 0111 + 1 = 1111 1110 1101 1000

Маскирование с помощью 0xFF = 1101 1000 = 216 = 0xD8

0xD8 & 0x7F = 0x58 = 88 dec (| 0x40 дает тот же результат)

Я предполагаю, что вы неправильно форматируете результат

2
possum 22 Июл 2020 в 14:10