【发布时间】:2010-05-06 14:34:45
【问题描述】:
我需要一个函数将 32 位或 24 位有符号(二进制补码)十六进制字符串转换为长整数。需要在 32 位和 64 位机器上工作(不管 long int 的大小),并且无论机器是否是二进制补码机器都可以工作。
解决方案:
long int hex2li (char hexStr[], int signedHex)
{
int bits = strlen (hexStr) * 4;
char *pEnd;
long long int result = strtoll (hexStr, &pEnd, 16);
if (pEnd[0] == '\0')
{
if (signedHex)
{
if (result >= (1LL << (bits - 1))) result -= (1LL << bits);
}
return (long int) result;
}
return LONG_MIN;
}
【问题讨论】:
-
这是不对的 - 以
8、9、A、B、C、D和E开头的十六进制字符串也应该都是负数。 -
您将无法获得一个函数来处理两种类型的字符串,因为 FFFFFF 意味着不同的事物,如 24 位有符号十六进制数和 32 位有符号十六进制数。另外,在非二进制补码机器上工作是真正的要求吗?
-
看起来您正在使用
long为 32 位的机器。 FFFFFFFF 大于 32 位有符号值中可表示的最大值,因此,2^31 -1 是可表示的最大值,因此改为使用。 -
我认为您可以使用字符串的长度来获取字节数,以便您知道是将其解释为 24 位还是 32 位字符串。基本上我想要一个将字符串
FFFFFF和FFFFFFFF映射到-1的函数。 -
嗯,您可以使用
pEnd和hexStr之间的差异来查看转换了多少位,但这将是一个非常不寻常的界面。您真的要将“00FFFF”和“FFFF”视为不同的数字吗?规范说您从什么获得输入?
标签: c string hex twos-complement