代码之家  ›  专栏  ›  技术社区  ›  nos

将单个十六进制字符转换为其C中的字节值#

  •  4
  • nos  · 技术社区  · 16 年前

    这将把1个十六进制字符转换为其整数值,但需要构造一个(子)字符串。

    Convert.ToInt32(serializedString.Substring(0,1), 16);
    

    .NET是否有一种内置的方法将单个十六进制字符转换为不涉及创建新字符串的字节(或in t,无所谓)值?

    5 回复  |  直到 16 年前
        1
  •  16
  •   Ben M    16 年前
    int value = "0123456789ABCDEF".IndexOf(char.ToUpper(sourceString[index]));
    

    或者更快(减法与数组搜索),但不检查错误输入:

    int HexToInt(char hexChar)
    {
        hexChar = char.ToUpper(hexChar);  // may not be necessary
    
        return (int)hexChar < (int)'A' ?
            ((int)hexChar - (int)'0') :
            10 + ((int)hexChar - (int)'A');
    }
    
        2
  •  16
  •   almog.ori    16 年前

    如果我错了请纠正我,但你能简单地用一下吗

    Convert.ToByte(stringValue, 16);
    

    只要StringValue代表十六进制数?这不是基准参数的点吗?

    字符串是不可变的,我认为没有一种方法可以在索引0处获取char的子字符串字节值,而不创建新的字符串。

        3
  •  2
  •   Ben Lesh    16 年前

    当然,您可以在不需要创建另一个字符串的情况下获得十六进制值。我不确定从性能上看,它真正能给你带来什么好处,但既然你问了,这就是你要求的。

        public int FromHex(ref string hexcode, int index)
        {
                char c = hexcode[index];
                switch (c)
                {
                    case '1':
                        return 1;
                    case '2':
                        return 2;
                    case '3':
                        return 3;
                    case '4':
                        return 4;
                    case '5':
                        return 5;
                    case '6':
                        return 6;
                    case '7':
                        return 7;
                    case '8':
                        return 8;
                    case '9':
                        return 9;
                    case 'A':
                    case 'a':
                        return 0xa;
                    case 'B':
                    case 'b':
                        return 0xb;
                    case 'C':
                    case 'c':
                        return 0xc;
                    case 'D':
                    case 'd':
                        return 0xd;
                    case 'E':
                    case 'e':
                        return 0xe;
                    case 'F':
                    case 'f':
                        return 0xf;
                    case '0':
                    default:
                        return 0;
                }
            }
        }
    
        4
  •  1
  •   JaredPar    16 年前

    如果您知道十六进制值只是一个字节,那么只需将其转换为Int32,然后强制转换

    var b = (byte)(Convert.ToInt32(serializedString, 16));
    
        5
  •  -1
  •   Paul van Brenk    16 年前
    Encoding.UTF8.GetBytes( serializedString.ToCharArray(), 0, 1)
    

    更便宜的可能是:

    Encoding.UTF8.GetBytes( new char[]{ serializedString[0] }, 0, 1)
    

    这只会将有趣的字符添加到char[]中,而不会添加整个字符串。