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)

使用 LibreOffice Basic 迭代控件

如何在 Basic 中使用 LibreOffice 功能?

使用 BASIC 在 LibreOffice 中复制表格的最后一行

LibreOffice Basic:用于拆分字符串的现有实用程序?