【问题标题】:Convert Double to Hex and back to Long in Chinese Unicode for VB6在 VB6 的中文 Unicode 中将 Double 转换为 Hex 并返回 Long
【发布时间】:2017-05-15 06:46:08
【问题描述】:

我是 VB6 的新手,我想将参数从 Double 转换为 Hex,然后再转换回 Long 用于中文 Unicode。

这里的问题是对于从 1 到 127 的输入值,输出是相同的。对于超过 127 的值,输出为 63。参数长度为 4 个字节。这是我到目前为止使用的 2 个转换函数的 sn-p:

双转十六进制:

Public Function ConvDoubleToHexString(dVal As Double, ByVal nByteCount As Integer) As String
    m = 1
    sHex = Hex(dVal)

    nByteCountMerk = nByteCount
    If nByteCount < Len(sHex) / 2 Then nByteCount = Len(sHex) / 2
    If nByteCount < 1 Then nByteCount = 1

    sHex = String(nByteCount * 2 - Len(sHex), "0") & sHex 
    For n = 0 To nByteCount - 1
        sTmp = ChrW(Val("&H" & Mid(sHex, m, 2)))
        m = m + 2
        sRet = sRet & sTmp
    next n

    If Not bLH Then
        ConvDoubleToHexString = Right(sRet, nByteCountMerk)
    Else
        For n = Len(sRet) To 1 Step -1
            sLH = sLH & Mid(sRet, n, 1)
        Next n
        ConvDoubleToHexString = Left(sLH, nByteCountMerk)
    End If
End Function

HexToLong:

Public Function ConvHexStringToLong(sHex As String) As Long
    If sHex = "" Then
        ConvHexStringToLongAbs = knolong
        Exit Function
    End If

    For i = 1 To Len(sHex)
        If l >= 8388608 Then
            ConvHexStringToLongAbs = knolong
            Exit Function
        End If

        l = l * 256 * 2
        l = l + Asc(Mid(sHex, i, 1))
    Next

    ConvHexStringToLong = l
End Function

【问题讨论】:

  • 我很困惑为什么会涉及双重问题?无论编码如何,这是用于传递任何类型字符的错误数据类型。您能否提供有关该参数的其他详细信息?
  • 嗨@tcarvin 感谢您的回复。输入参数适用于 1-127 之间的值。除此之外,它还显示一个“?”作为它的值,即十进制的 63。转换后我无法看到实际值(128+)。困扰我的线路是:sTmp = ChrW(Val("&amp;H" &amp; Mid(sHex, m, 2)))
  • 你确定它不只是向你展示一个 ?因为调试器或即时窗口无法以它们使用的字体呈现这些字符?
  • @tcarvin 这是我在 DoubleToHex 函数中 For 循环的每一步调试时看到的: 1. dVal -> 129# sHex -> "00000081" sTmp -> vbNullChar sRet -> vbNullChar 2. dVal -> 129# sHex -> "00000081" sTmp -> vbNullChar sRet -> String(2,0) 3. dVal -> 129# sHex -> "00000081" sTmp -> "?" sRet -> String(3,0) 4. dVal -> 129# sHex -> "00000081" sTmp -> "?" sRet -> String(3,0) & "?"

标签: vba unicode vb6 unicode-string


【解决方案1】:

从 cmets 转移到回答,那里的对话太多了。

尝试改变这个:

sHex = String(nByteCount * 2 - Len(sHex), "0") & sHex 
For n = 0 To nByteCount - 1
    sTmp = ChrW(Val("&H" & Mid(sHex, m, 2)))
    m = m + 2
    sRet = sRet & sTmp
next n

到这里:

Dim charCode As Long
sHex = String(nByteCount * 2 - Len(sHex), "0") & sHex 
For n = 0 To nByteCount - 1
    sTmp = ChrW(Val("&H" & Mid(sHex, m, 2)))
    charCode = AscW(sTmp)
    m = m + 2
    sRet = sRet & sTmp
next n

然后,当您在调试器中单步执行每个循环的代码时,请确认 charCode 的值是您期望的值。


编辑:

我仍然不清楚您真正想要完成什么(断章取义的功能并不能说明问题)。但是,如果您尝试将 unicode 字符串一次编码为一个字符,然后将其编码为十六进制,那么您将需要使用 4 个字符的十六进制代码,因为它们每个都是 2 个字节。像这样的东西(未检查语法):

Dim unicodeInput As String 
unicodeInput = "whatever"

Dim offset As Long
Dim charCode As Integer
Dim hexOutput As String

for offset = 1 to Len(unicodeInput)
   charCode = AscW(Mid$(unicodeInput, offset, 1))
   hexOutput = hexOutput & Right$("0000" & Hex$(charCode), 4)
next

然后您可以将其从十六进制移回原始字符串,执行如下操作:

Dim hexInput As String 
hexInput = "003900390039"

Dim offset As Long
Dim char As String
Dim output As String

for offset = 1 to Len(hexInput) Step 4
   char = ChrW(CLng("&H" & Mid$(hexInput, offset, 4)))
   output = output & char
next

我不确定这是否能解决您的问题,因为我看不出您为什么要将 unicode 字符序列编码和解码到十六进制缓冲区中。

您可能不希望十六进制值中有多余的零,但为了容纳 Unicode 字符,您将需要它们,因为它们可能大于一个字节。

【讨论】:

  • charCode 的值确实是我所期望的,但是从 Double 到 Hex 的转换并没有发生。
  • 要非常清楚,您并没有将双精度数转换为十六进制数。 VB 将你的 double 隐式转换为整数类型。如果您将方法定义更改为 Long 而不是 Double 您的代码仍然是相同的。其次,我不清楚在数字到十六进制的转换中还需要什么,而简单地调用 Hex(num) 本身并不能解决所有问题。您能否编辑您的问题以阐明您真正想要实现的目标目标
  • 我实际上解决了我发布的一些问题。问题是,在读取十六进制值时,它被读取为 ine(例如:999 被读取为 3E7,而我希望它被单独读取,如下面的代码所示(imgur.com/B6OE7gG
  • 然后,从 ConvToHex 函数中,我将 ConvToHex 值设为 String(3,0) & "575757",这是正确的。由于 12 月的 57 是十六进制的 39,即 9,因此等于 999。现在的问题是,当我运行下面的代码时,我没有得到输出 999。我应该在下面的代码中进行哪些更改? imgur.com/kaG7Rq6
猜你喜欢
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 2015-08-23
  • 2021-12-03
  • 1970-01-01
相关资源
最近更新 更多