Перевести на VB

Язык C#: программирование на C#, портирование кода C# на VB и VB на C#.

Модератор: Ramzes

Димитрий
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 194
Зарегистрирован: 26.01.2005 (Ср) 22:47
Откуда: Волгоград

Перевести на VB

Сообщение Димитрий » 27.08.2005 (Сб) 22:48

Помогите правильно перевести пример программы на VB.
Которая позволяет записывать и читать
величины переменной длины, подобные временам дельта.
Функция WriteVarLen(), передает 32-битное значение и преобразует
его в последовательность байтов, записываемых в файл.
Функция ReadVarLen() читает последовательность байтов из
файла до тех пор, пока не достигнет последнего байта значения
переменной длины, после чего возвращает 32-битное значние.

Код: Выделить всё
void WriteVarLen(register unsigned long value)
{
register unsigned long buffer;
buffer = value & 0x7F;
while ( (value >>= 7) )
{
buffer <<= 8;
buffer |= ((value & 0x7F) | 0x80);
}
while (TRUE)
{
putc(buffer,outfile);
if (buffer & 0x80)
buffer >>= 8;
else
break;
}
}
unsigned long ReadVarLen()
{
register unsigned long value;
register unsigned char c;
if ( (value = getc(infile)) & 0x80 )
{
value &= 0x7F;
do
{
value = (value >> 7) + ((c = getc(infile)) & 0x7F);
} while (c & 0x80);
}
return(value);
}

заранее благодарен Дмитрий.

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

Сообщение GSerg » 28.08.2005 (Вс) 4:21

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

Димитрий
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 194
Зарегистрирован: 26.01.2005 (Ср) 22:47
Откуда: Волгоград

Сообщение Димитрий » 28.08.2005 (Вс) 8:37

А кто его знает! Судя по фигурным кнопкам С, но я не знаком даже с простым его синтаксисом. Программировал только бейсик начиная с МК85.

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

Сообщение GSerg » 28.08.2005 (Вс) 8:55

Я бы сказал, что это C, но никак не #.
И что, это надо на .NET перевести?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Димитрий
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 194
Зарегистрирован: 26.01.2005 (Ср) 22:47
Откуда: Волгоград

Сообщение Димитрий » 28.08.2005 (Вс) 18:22

Конечно! Всего то две функции, для знающего - одной пяткой :wink:

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 28.08.2005 (Вс) 20:51

Димитрий писал(а):Конечно! Всего то две функции, для знающего - одной пяткой :wink:


Для знающего - да, а для вас, боюсь - нет. Как вы поставили задачу, так мы ее и решили:

Код: Выделить всё
Public Class DmitryClass

    Public Sub WriteVarLen(ByVal value As Long)
        Dim buffer As Long

        buffer = value And 127

        value = RShiftLong(value, 7)


        While value
            buffer = LShiftLong(buffer, 8)
            buffer = buffer Or ((value And 127) Or 128)
            value = RShiftLong(value, 7)
        End While

        While True
            Console.WriteLine(buffer.ToString())

            If (buffer And 128) Then
                buffer = RShiftLong(buffer, 8)
            Else
                Exit While
            End If
        End While
    End Sub

    Public Function ReadVarLen() As Long
        Dim value As Long
        Dim c As Char

        Dim a() As Char

        a = Console.ReadLine().ToCharArray()

        value = AscW(a(0))

        If (value And 128) Then
            value = value And 127

            Do
                value = RShiftLong(value, 7) + (AscW(a(1)) And 127)
            Loop Until (AscW(c) And 128)
        End If

        Return value

    End Function

    Public Function LShiftLong(ByVal Value As Long, _
        ByVal Shift As Integer) As Long

        MakeOnBits()

        If (Value And (2 ^ (31 - Shift))) Then GoTo OverFlow

        LShiftLong = ((Value And OnBits(31 - Shift)) * (2 ^ Shift))

        Exit Function

OverFlow:

        LShiftLong = ((Value And OnBits(31 - (Shift + 1))) * _
           (2 ^ (Shift))) Or &H80000000

    End Function

    Public Function RShiftLong(ByVal Value As Long, _
       ByVal Shift As Integer) As Long
        Dim hi As Long
        MakeOnBits()
        If (Value And &H80000000) Then hi = &H40000000

        RShiftLong = (Value And &H7FFFFFFE) \ (2 ^ Shift)
        RShiftLong = (RShiftLong Or (hi \ (2 ^ (Shift - 1))))
    End Function

    Private OnBits(0 To 31) As Long

    Private Sub MakeOnBits()
        Dim j As Integer, _
            v As Long

        For j = 0 To 30

            v = v + (2 ^ j)
            OnBits(j) = v

        Next j

        OnBits(j) = v + &H80000000

    End Sub

End Class


На VB.NET :)

Только это вам не поможет. Лучше поищите нормальный класс для работы с MIDI файлами, или, что еще лучше, расскажите, что-таки хотите сделать :)
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Димитрий
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 194
Зарегистрирован: 26.01.2005 (Ср) 22:47
Откуда: Волгоград

Сообщение Димитрий » 29.08.2005 (Пн) 16:59

Спасибо большое за ответ :!: , попробую разобратся.
А делаю я небольшую прогу для работы с МИДИ файлами на низком уровне. Вот мне и нужно правильно прочитать величину переменной длины. Для интересующихся :arrow: http://dimit.pochta.ru/remontmidi.html

С низким поклоном Дмитрий.

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 29.08.2005 (Пн) 22:30

Тогда это вам не поможет. Я написал код, который читает с консоли и выводит, фактически, просто код символа. В принципе, это дословный перевод всего, ктоме getc.
В любом случае - прогуляйтесь до www.pscode.com и поищите там программы для работы с MIDI. Они там точно были!
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

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

Сообщение GSerg » 30.08.2005 (Вт) 8:33

Слушай Гайдара.
После чего читай мануал по FileStream, StreamReader и StreamWriter.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 30.08.2005 (Вт) 10:27

GSerg писал(а):Слушай Гайдара.


Золотые слова!
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali


Вернуться в C#

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

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

    TopList