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

Gor

Well-known member
07.06.2005
517
1
#1
Всем доброго времени суток!

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

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

Gor

Well-known member
07.06.2005
517
1
#4
вот и не изобретайте
берите LS2J бридж и вперед:
]]>http://noteslog.com/post/crc32/]]>
Что то я поторопился=) Обрадовался что проблема решена подключил библиотеку, стал суммровать свои строки и подставлять в функцию расчёта StringCRC32

Код:
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-тиричному виду)
Код:
	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-ричному значению что приводит к такой оошибке)))

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

Gor

Well-known member
07.06.2005
517
1
#5
Ну а если несколько по другому вопрос поставлю)

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

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

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

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

morpheus

скриптописец
07.08.2006
3 915
1
#7
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.
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#8
вспоминаем школьную информатику и пишем каркулятор :)
либо ищем подобную функцию на java и используем тот же бридж!
 

Gor

Well-known member
07.06.2005
517
1
#9
Код:
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 нет шестнадцатиричного вида!!!
=((
ну видимо только остаётся искать функцию на яве,
а на яве функцию перевода в шестнадцатиричную систему счисления никто не встречал?
надеюсь там ограничений таких нет...
Ну либо действительно свой калькулятор делать=)
 

Gor

Well-known member
07.06.2005
517
1
#10
В общем решил заменой строчки в Java функции

Код:
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()); 
}

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

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#11
не забудь только проверить до каких значений числа :)
 
30.05.2006
1 345
11
#12
CRC32 возвращает не integer*4, а скорее Cardinal*4 Т.е. беззнаковое.
В LS беззнакового integer нету. Поэтому когда движок распознает присвоение положительного числа более 2^31, он ругается.
WorkAround - юзайте тип Currency