【问题标题】:Reverse the order of Hex digits反转十六进制数字的顺序
【发布时间】:2015-12-01 15:25:26
【问题描述】:

我需要取一个整数值并对其进行转换,以便当它以十六进制表示时,数字是相反的。例如:

Dim a As Integer = &H4321
Dim a_changedorder As Integer = ReverseHexDigits(a)
Console.Writeline(a_changedorder.ToString("X4")) ' Should output 1234

我怎样才能实现像这样工作的ReverseHexDigits 方法?

作为第二个示例,&H4F2A 应该变为 &HA2F4

【问题讨论】:

  • dim a as Integer = 0x4321 不会编译,因为这不是 VB 中指定十六进制的方式:Dim a As Integer = &H4321
  • 您必须通过将变量视为字符串来执行这些修改。要获取整数的十六进制形式(您要修改的字符串),您可以使用函数Hex
  • How can I change the order of the numbers 它是一个数字,您实际上是在更改 。当您分配 &H4321 时,请查看 a 的值,它应该是 10 中的 17,185
  • @Plutonix 也可以更改原始十六进制形式的数字顺序。这会有点奇怪,尽管 OP 可能想要创建某种加密。
  • 你不是很清楚。都有些什么样的规矩?在您的示例中,您似乎暗示您想要完全反转所有的半字节,但只反转低位单词中的半字节。高字中的半字节是不是也颠倒了,但字却保留在原位?还是单独留下高词?由于您无法解释您的意思,也许了解您需要这样做的原因会有所帮助。

标签: .net vb.net string hex endianness


【解决方案1】:

虽然 Matt 的方法可以工作,但将整数转换为十六进制字符串,将字符串中字符的顺序颠倒,然后再次将其解析回整数,效率相当低。如果效率很重要,并且您只需要在一个两字节整数中反转半字节,那么以下将起作用:

Public Function ReverseHexDigits(input As Integer) As Integer
    Return ((input And &HF) << 12) Or 
        ((input And &HF0) << 4) Or 
        ((input And &HF00) >> 4) Or 
        ((input And &HF000) >> 12)
End Function

但是,这很令人困惑,因为它只对较低的两个字节进行操作。如果它对UShort 变量进行操作会更清楚:

Public Function ReverseHexDigits(input As UShort) As UShort
    Return ((input And CUShort(&HF)) << 12) Or
        ((input And CUShort(&HF0)) << 4) Or
        ((input And CUShort(&HF00)) >> 4) Or
        ((input And CUShort(&HF000)) >> 12)
End Function

【讨论】:

    【解决方案2】:

    (我真的不明白你为什么要这样做......但是)只需将数值转换为字符串,reverse it 然后再转换回数值:

        Dim a As UShort = &H4321
    
        Dim hexCharArray As Char() = a.ToString("X4").ToCharArray
        Array.Reverse(hexCharArray)
        Dim hexStringReversed = New String(hexCharArray)
    
        Dim a_changedorder As UShort = Convert.ToUInt16(hexStringReversed, 16)
    

    确认输出正确:

    Debug.WriteLine(a_changedorder.ToString("X4")) '1234
    

    请注意,您应该使用 UShort,因为您只有两个字节,Integer 已签名并且是 4 个字节

    【讨论】:

    • 这正是我一直在寻找并解决了我的问题!很完美。我的英语不是很好,并试图用这个例子来解释它。非常感谢@Matt Wilko 像冠军一样工作!
    猜你喜欢
    • 2023-03-14
    • 2012-07-16
    • 2018-07-26
    • 2020-11-25
    • 1970-01-01
    • 2011-12-19
    • 2021-08-01
    • 2014-01-29
    • 1970-01-01
    相关资源
    最近更新 更多