Проблема с типа данных

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

sotonic
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 08.02.2006 (Ср) 10:11

Проблема с типа данных

Сообщение sotonic » 01.03.2006 (Ср) 18:03

Помогите плиз. Не знаю какой тип надо использовать. Необходим беззнаковый целочисленный тип, длинной 2 байта. Uint16 не катит так как для него нельзя использовать такие операции как <<, >>, XOR
В сях есть такой тип unsigned short. Подскажите как мне быть?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 01.03.2006 (Ср) 23:38

UShort

sotonic
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 08.02.2006 (Ср) 10:11

Сообщение sotonic » 02.03.2006 (Чт) 0:57

Это ты типа так сотртрил? Нет такого типа. Лучше бы что нить по делу сказал. Или вобще молчи уж тогда

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 02.03.2006 (Чт) 1:11

Ты форумом не ошибся остряк? :D

из MSDN:

UShort Data Type (Visual Basic)

Holds unsigned 16-bit (2-byte) integers ranging in value from 0 through 65,535.

Remarks
Use the UShort data type to contain binary data too large for Byte.

The default value of UShort is 0.

Programming Tips
Negative Numbers. Because UShort is an unsigned type, it cannot represent a negative number. If you use the unary minus (-) operator on an expression that evaluates to type UShort, Visual Basic converts the expression to Integer first.

CLS Compliance. The UShort data type is not part of the Common Language Specification (CLS), so CLS-compliant code cannot consume a component that uses it.

Widening. The UShort data type widens to Integer, UInteger, Long, ULong, Decimal, Single, and Double. This means you can convert UShort to any of these types without encountering a System.OverflowException error.

Type Characters. Appending the literal type characters US to a literal forces it to the UShort data type. UShort has no identifier type character.

Framework Type. The corresponding type in the .NET Framework is the System.UInt16 structure.

sotonic
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 08.02.2006 (Ср) 10:11

Сообщение sotonic » 02.03.2006 (Чт) 9:31

Хм, может в MSDN и написано, но у себя я такого типа не вижу (в ВБ)

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 02.03.2006 (Чт) 11:42

Использую FW 2.0 никаких проблем:

Код: Выделить всё
        Dim US As UShort
        US = 13 << 1 Xor 35
        MsgBox(US.ToString)
        'ответ 57

sotonic
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 08.02.2006 (Ср) 10:11

Сообщение sotonic » 02.03.2006 (Чт) 12:10

Понятно, у меня просто 1.1 :) Спасибо

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 02.03.2006 (Чт) 13:16

А чем тебя Integer не устраивает?
Занимает 4 байта, два байта влезет без проблем.
Ты обрисуй свою задачу поконкретней тогда и ответ получишь конкретный.

sotonic
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 08.02.2006 (Ср) 10:11

Сообщение sotonic » 02.03.2006 (Чт) 13:25

Скачал FW2.0 все равно нету такого типа у меня. Нужно именно 2 байта. Для вычисления контрольной суммы.
Есть на сях такая функция, но надо ее на ВБ перевести
unsigned short Hash(char Byte, char nbit, unsigned short CRC)
{
for (short i = 0; i < nbit; i++, Byte <<= 1)
{
if ( ( Byte ^ (CRC>>8) ) & 0x80 )
{
CRC <<= 1;
CRC ^= 0x8F57;
}
else CRC <<= 1;
}
return CRC;
}

sotonic
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 08.02.2006 (Ср) 10:11

Сообщение sotonic » 02.03.2006 (Чт) 13:46

Что ж у тебя такого хитрого там, что есть тип Ushort? Может раскопаешь? ОЧень хотелось бы. Заранее благодарю

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 02.03.2006 (Чт) 15:05

вставь эти строчки в свой код а потом подведи курсор сначала к UInt16 а потом к UShort и внимательно
всмотрись в текст всплывающего окна :wink:

Код: Выделить всё
        Dim s As UInt16
        Dim s1 As UShort


это одно и тоже и кстати << >> xor and - использовать можно (FW 2.0)
Microsoft Visual Studio 2005 version 8.0.50630.0
Microsoft Net Framework 2.0 version 2.0.50630

если ничего не выйдет напишу как обойтись Интегером

sotonic
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 08.02.2006 (Ср) 10:11

Сообщение sotonic » 02.03.2006 (Чт) 15:35

Все понятно, у меня VS2003. Там видемо этих типов еще не было. Что же делать то теперь?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 02.03.2006 (Чт) 16:07

Код: Выделить всё
Private Function Hash(ByVal Значение As Integer) As UInt16
        'упрощенный вариант
        For Nb As Integer = 1 To 8
            Значение <<= 1
        Next

        'обрезаем значение до двух байт, чтобы не получить ошибку преобразования
        Значение = Значение And &HFFFF

        'возвращаем чистые два байта
        Return CType(Значение, UInt16)

    End Function

sotonic
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 08.02.2006 (Ср) 10:11

Сообщение sotonic » 02.03.2006 (Чт) 16:37

Спасибо :)

sotonic
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 08.02.2006 (Ср) 10:11

Сообщение sotonic » 02.03.2006 (Чт) 16:39

Код: Выделить всё
Return CType(Значение, UInt16)

на эту строчку ругается, говорит что не может конвертировать

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 02.03.2006 (Чт) 16:42

А тебе так важно что бы функция возвращала UShort? Чем Integer то не устраивает?

sotonic
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 08.02.2006 (Ср) 10:11

Сообщение sotonic » 02.03.2006 (Чт) 17:54

используется эта функция так:
Код: Выделить всё
crc = Hash(command2[3] << 1, 7,
               Hash(command2 [2] << 1, 7,
               Hash(command2 [1] << 1, 7,
               Hash(command2 [0] << 1, 7, 0))));



получаем число, переводим в HEX и получаем 4е знака. Это как раз наш хэш код. Поэтому мне необходимо именно Short. Иначе число получается за счет смещиний всякий и т.п. очень большим. 7-8 знаков

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.03.2006 (Чт) 18:04

А в данном случае не пофигу ли, short или ushort?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 02.03.2006 (Чт) 18:13

ну так обрежь его:

Значение = Значение And &HFFFF

в результате получишь UShort в шкуре Интегера

sotonic
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 08.02.2006 (Ср) 10:11

Сообщение sotonic » 03.03.2006 (Пт) 8:54

GSerg
Ты не прав. Не пофигу UShort или Short. Если использовать Short то здесь CRC ^= 0x8F57 получается переполнение
Nord777
На счет обрезания я сейчас попробую

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.03.2006 (Пт) 12:18

Почему я не прав?
Два байта будут теми же независимо от того, как их трактовать.

Код: Выделить всё
CRC <<= 1
CRC = CRC Xor -28841S
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sotonic
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 08.02.2006 (Ср) 10:11

Сообщение sotonic » 03.03.2006 (Пт) 14:14

Спасибо ребята. Оба варианта верны :)

Значение = Значение And &HFFFF
CRC = CRC Xor -28841S


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 96

    TopList