如何将 ASCII HEX 字符转换为其值 (0-15)?

发布于 2024-08-26 08:54:03 字数 339 浏览 8 评论 0原文

我正在编写一个字符串解析器,我想到可能有一些非常有趣的方法可以将 ASCII 十六进制字符 [0-9A-Fa-f] 转换为其数值。

[0-9A-Fa-f] 转换为 015 之间的值的最快、最短、最优雅或最晦涩的方法是什么代码>?

如果您愿意,可以假设该字符是有效的十六进制字符。

我没有机会,所以我会在最无聊的时候尝试一下。

( c <= '9' ) ? ( c - '0' ) : ( (c | '\x60') - 'a' + 10 )

I am writing a string parser and the thought occurred to me that there might be some really interesting ways to convert an ASCII hexadecimal character [0-9A-Fa-f] to it's numeric value.

What are the quickest, shortest, most elegant or most obscure ways to convert [0-9A-Fa-f] to it's value between 0 and 15?

Assume, if you like, that the character is a valid hex character.

I have no chance so I'll have a go at the most boring.

( c <= '9' ) ? ( c - '0' ) : ( (c | '\x60') - 'a' + 10 )

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

混浊又暗下来 2024-09-02 08:54:03

(c&15)+(c>>6)*9

为了响应“它是如何工作的”,它会丢弃足够的位,以便数字映射到 [0:9] 和字母映射到 [1:6],然后为字母添加 9。 c>>6if (c >= 64) ... 的替代。

(c&15)+(c>>6)*9

In response to "How does it work", it throws away enough bits so that the numbers map to [0:9] and the letters map to [1:6], then adds 9 for the letters. The c>>6 is a stand-in for if (c >= 64) ....

丑疤怪 2024-09-02 08:54:03

一种简单的方法是在字符串中查找它:

int n = "0123456789ABCDEF".IndexOf(Char.ToUpper(c));

另一种方法是将其转换为数字,然后检查它是否是字符:

int n = Char.ToUpper(c) - '0';
if (n > 9) n -= 7;

One simple way is to look for it in a string:

int n = "0123456789ABCDEF".IndexOf(Char.ToUpper(c));

Another way is to convert it as a digit, and then check if it's a character:

int n = Char.ToUpper(c) - '0';
if (n > 9) n -= 7;
十年不长 2024-09-02 08:54:03
private byte[] HexStringToBytes( string hexString )
{
    byte[] bytes = ASCIIEncoding.ASCII.GetBytes(hexString);
    byte[] ret = new byte[bytes.Length / 2];
    for (int i = 0; i < bytes.Length; i += 2)
    {
       byte hi = (byte)(((bytes[i] & 0x40) == 0) ? bytes[i] & 0x0F : bytes[i] & 0x0F + 9);
       byte lo = (byte)(((bytes[i+1] & 0x40) == 0) ? bytes[i+1] & 0x0F : bytes[i+1] & 0x0F + 9);
       ret[i / 2] = (byte)((hi << 4) | lo);
    }
    return ret;
}
private byte[] HexStringToBytes( string hexString )
{
    byte[] bytes = ASCIIEncoding.ASCII.GetBytes(hexString);
    byte[] ret = new byte[bytes.Length / 2];
    for (int i = 0; i < bytes.Length; i += 2)
    {
       byte hi = (byte)(((bytes[i] & 0x40) == 0) ? bytes[i] & 0x0F : bytes[i] & 0x0F + 9);
       byte lo = (byte)(((bytes[i+1] & 0x40) == 0) ? bytes[i+1] & 0x0F : bytes[i+1] & 0x0F + 9);
       ret[i / 2] = (byte)((hi << 4) | lo);
    }
    return ret;
}
我不在是我 2024-09-02 08:54:03

C中你可以这样:

if(isdigit(c)) 
  num = c -'0';
else if(c>='a' && c<='f')
  num = 10 + c - 'a';
else if(c>='A' && c<='F')
  num = 10 + c - 'A';

In C you can so something like:

if(isdigit(c)) 
  num = c -'0';
else if(c>='a' && c<='f')
  num = 10 + c - 'a';
else if(c>='A' && c<='F')
  num = 10 + c - 'A';
溺渁∝ 2024-09-02 08:54:03

在 JavaScript 中:

num = parseInt(hex, 16);

In JavaScript:

num = parseInt(hex, 16);
眼前雾蒙蒙 2024-09-02 08:54:03

这是无聊的 C 版本(我的 C 很生疏,所以它也可能是错误的)。

char parseIntChar(const char p) {
  char c[2];
  c[0]=p;
  c[1]=0;
  return strtol(c,0,16);
}

Here's the boring C version (and my C is very rusty, so it's probably wrong as well).

char parseIntChar(const char p) {
  char c[2];
  c[0]=p;
  c[1]=0;
  return strtol(c,0,16);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文