функция расчёта Crc 32

Тема в разделе "Lotus - Программирование", создана пользователем Gor, 16 янв 2009.

  1. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Всем доброго времени суток!

    Кто нибудь писал функцию расчёта CRC 32 кода на LS ??
    Может кто нибудь поделится?)) Не хочется изобретать велосипед((

    Я честно говоря даже с алгоритмом плохо знаком...
    спасибо
     
  2. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
  3. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Спасибо) действительно работает)
     
  4. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Что то я поторопился=) Обрадовался что проблема решена подключил библиотеку, стал суммровать свои строки и подставлять в функцию расчёта StringCRC32

    Код (Text):
    Option Public
    Option Declare

    Use "CRC32 Java"
    Uselsx "*javacon"

    Function StringCRC32( aString As String ) As String
    Dim jSession As JavaSession
    Set jSession = New JavaSession
    Dim jClass As JavaClass
    Set jClass = jSession.GetClass( "StringCRC32" )
    StringCRC32 = jClass.StringCRC32( aString )
    End Function
    Я так понимаю что функция StringCRC32 мне всегда выдаёт десятичное число....

    Вот что я пытаюсь сделать в своём куске кода (результат возвращаемой мне функции перевести в к 16-тиричному виду)
    Код (Text):
        Dim aString As String
    aString = doc.CF_USD(0) & sAccount & doc.CF_RUB(0) & rate

    hashtext = StringCRC32(aString)

    Print #idfile, "CRC32: "Hex(hashtext)";"
    На строчке Print #idfile, "CRC32: "Hex(hashtext)";" выдаёт ошибку - Overflow....
    hashtext у меня = "2833674775"
    Вообще функция StringCRC32 всё время выдаёт разные 10-тизначные числа, на разные входные значения...
    Я и непойму что это за такое десятизначные числа которые она мне возвращает, поэтому решил результат переводить к 16-ричному значению что приводит к такой оошибке)))

    ПОдскажите в чём проблема...?
     
  5. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Ну а если несколько по другому вопрос поставлю)

    Почему не работает конструкция типа

    hashtext = "2833674775"
    s = Hex$(hashtext)

    Ошибка - Overflow
    Хотя в калькуляторе десятичное число 2833674775 переводится в шестнадцатиричное легко - A8E67217

    Не работает функция Hex$?
     
  6. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Потому что
     
  7. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Gor
    судя по хэлпу, просто напросто слишком большое число

    HEX принимает Long или Integer
    If the data type of numExpr is not Integer or Long, LotusScript attempts to convert it to a Long. If it cannot be converted, an error occurs.

    ну а Long соответственно
    A Long value is a whole number in the range -2,147,483,648 to 2,147,483,647 inclusive.
     
  8. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    вспоминаем школьную информатику и пишем каркулятор :)
    либо ищем подобную функцию на java и используем тот же бридж!
     
  9. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Код (Text):
    A Long value is a whole number in the range -2,147,483,648 to 2,147,483,647 inclusive.
    =(((((
    т.е. если у меня число предположим 2,547,483,647 и оно > 2,147,483,647 то функция Hex$ ругаться будет?!
    А почему так несправедливо??? Это же не означает что у числа 2,547,483,647 нет шестнадцатиричного вида!!!
    =((
    ну видимо только остаётся искать функцию на яве,
    а на яве функцию перевода в шестнадцатиричную систему счисления никто не встречал?
    надеюсь там ограничений таких нет...
    Ну либо действительно свой калькулятор делать=)
     
  10. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    В общем решил заменой строчки в Java функции

    Код (Text):
    import java.util.zip.CRC32;

    public class StringCRC32 {

    public static String StringCRC32 ( String s )
    {
    byte[] b = s.getBytes();

    CRC32 crc = new CRC32();

    for ( int i=0; i<b.length; i++ )
    {
    crc.update( b[i] );
    }

    return Long.toHexString(crc.getValue());
    }

    }
    Считает и переводит в шестнадцатиричную систему правильно.
     
  11. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    не забудь только проверить до каких значений числа :)
     
  12. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    CRC32 возвращает не integer*4, а скорее Cardinal*4 Т.е. беззнаковое.
    В LS беззнакового integer нету. Поэтому когда движок распознает присвоение положительного числа более 2^31, он ругается.
    WorkAround - юзайте тип Currency
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
Загрузка...

Поделиться этой страницей