LibreOffice Basic 是不是可以使用无符号长类型?
Posted
技术标签:
【中文标题】LibreOffice Basic 是不是可以使用无符号长类型?【英文标题】:Are unsigned long types available to LibreOffice Basic?LibreOffice Basic 是否可以使用无符号长类型? 【发布时间】:2020-06-08 23:06:22 【问题描述】:我想为 LibreOffice Calc 编写一个简单的 32 位 FNV hash function。但是,LibreOffice Basic only supports signed long data types,因此您将获得“不允许的值或数据类型。溢出”。第 7 行出错,代码如下:
Function Hash(strText as String) as Long
Dim h As Long
Dim nextChar As String
Dim temp As Long
h = 2166136261
For i = 1 To Len(strText)
nextChar = Mid(strText, i, 1)
temp = Asc(nextChar)
h = h XOR temp
h = h * 16777619
Next
Hash = h
End Function
因为上面代码中h
变量赋值为2166136261,显然是越界了。是否可以在 LibreOffice Basic 中使用无符号长(0 到 4294967295)数据类型?如果有,怎么做?
【问题讨论】:
【参考方案1】:你可以这样做:
Sub CallHash
oMasterScriptProviderFactory = createUnoService(_
"com.sun.star.script.provider.MasterScriptProviderFactory")
oScriptProvider = oMasterScriptProviderFactory.createScriptProvider("")
oScript = oScriptProvider.getScript(_
"vnd.sun.star.script:foo.py$hash?language=Python&location=user")
hashString = oScript.invoke(Array("bar"), Array(), Array())
MsgBox hashString
End Sub
foo.py:
def hash(strText):
h = 2166136261
for nextChar in strText:
temp = ord(nextChar)
h = h ^ temp
h = h * 16777619
return str(h)
或放弃 Basic 并仅使用 Python-UNO。
UNO API 中有无符号长整型值。但是,我没有找到任何 API 方法来对此对象执行计算。
Dim o As Object
o = CreateUnoValue("unsigned long", 2166136261)
【讨论】:
以上是关于LibreOffice Basic 是不是可以使用无符号长类型?的主要内容,如果未能解决你的问题,请参考以下文章
在 LibreOffice Basic 中测试字符串的第一个字符是不是为非数字
在 Basic 中计算自己的对数(LibreOffice Calc Macro)