Я написал функцию для вычисления контрольной суммы на двух разных языках программирования. В 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, что неверно.
Какие-либо предложения?
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
дает тот же результат)
Я предполагаю, что вы неправильно форматируете результат
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.
calculateCheckSum
и то, как вы распечатать или сообщить результат. Также, пожалуйста, найдите время, чтобы прочитать страницы справки, возьмите SO обзор, прочитайте Как спросить, а также этот контрольный список вопросов.