LotusScript中的Unsigned Long?如何关闭溢出检测?

时间:2013-10-21 06:08:05

标签: lotus-domino lotusscript

上下文:我正在对Lotusscript实施SHA-256哈希。

Hashing适用于32位。 LotusScript只有签名 Long。当结果大于2,147,483,647时,我们得到溢出

问题:如何关闭Long上的溢出检测

如果不可能,是否有解决方法?我在考虑 Richard Schwartz http://femkegoedhart.com/2012/02/05/lotusscript-timedifference-long-data-type-grrr/中所做的事情,我怎么能用NotesDateTime帮助解决我的问题呢?

我应该“忘记这个”但是如何在Lotusscript中哈希(好吧我可以考虑使用LS2J并使用标准的java SHA 256)

当然如果你有一个SHA-256的LS实现,它也是一个很好的回应: - )

感谢您的帮助,我感到有些失落......

部分代码:

Dim T1 As Long
Dim h2 As Long 
Dim Sigma1 As Long
Dim K_t As Long

h2=1541459225
Sigma1 = 21895337
K_t=1116352408 

MsgBox String(32-Len(Bin$(h2)),"0")+Bin$(h2)+" " +"Bin$(h2)"+Chr$(13)+ _
String(32-Len(Bin$(Sigma1)),"0")+Bin$(Sigma1)+" " +"Bin$(Sigma1)"+Chr$(13)+ _
String(32-Len(Bin$(K_t)),"0")+Bin$(K_t)+" " +"Bin$(K_t)",,"DEBUG" 

T1 = h2 + Sigma1
MsgBox "T1 = " & T1 & " binary representation:" + String(32-Len(Bin$(T1)),"0")+  Bin$(T1)

T1 = h2 + Sigma1 + K_t  ' **this line cause overflow**
MsgBox "T1 = " & T1 & " binary representation:" + String(32-Len(Bin$(T1)),"0")+  Bin$(T1)

请注意,我的实施基于 Chris Veness 的工作:http://www.movable-type.co.uk/scripts/sha256.html

3 个答案:

答案 0 :(得分:2)

您无法在LotusScript中关闭LONG上的溢出检测。此外,您在BIN()函数上方的示例将尝试转换为long,以排除使用DOUBLE。

dateTime,对象虽然它将数字视为LONG unsigned,但它可能有点使用。

就个人而言,我建议创建一个小C DLL来完成工作并将其作为字符串传回。

或者用Java创建代码,因为它没有LS所具有的相同限制。

答案 1 :(得分:0)

正如Simon O'Doherty所说,无法在LotusScript中关闭LONG上的溢出检测。

我放弃了LS的方式......现在(也许我有一天会做另一次尝试.Frantisek Kossuth,你的权利我需要从开始变量限制......这里的棘手部分)

感谢您的帮助!

*西蒙:我更喜欢做LS2J而不是DLL!

我加入了java中非常简单的类:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA256 {
public String sha256(String message) throws NoSuchAlgorithmException {
    MessageDigest md1 = MessageDigest.getInstance("SHA-256");
    String resu = A9Utility.bytesToHex(md1.digest(message.getBytes()));

    System.out.println("here SHA256: resu ="+resu);
    return resu;
}
}

对于A9Utility.bytesToHex,我使用了https://code.google.com/p/a9cipher/source/browse/src/cosc385final/A9Utility.java

所以现在我在LS的电话是:

UseLSX "*javacon"   
Use "SHA256"
[...]
Dim mySession As JavaSession
Dim myClass As JavaClass
Dim myObject As JavaObject
Set mySession = New JavaSession()

Set myClass = mySession.GetClass("SHA256")
Set myObject = myClass.CreateObject()

Dim resu As String
resu = myObject.sha256(message)

答案 2 :(得分:0)

您可以在LS中使用COM组件并调用它。有许多经过充分开发和验证的SHA-256(和其他哈希)COM组件。

如果您遵循此路由,则需要将返回值“处理”为字符串或其他二进制编码(base64?),因为结果可能(或可能不)需要unsigned long来保存原始值。大多数这些组件提供了执行此操作的方法。

对于今天的应用程序有点“老式”,但是,嘿,你正在使用LS,所以也许这不是一个问题。