gpt4 book ai didi

c - 带符号的十六进制字符串到 long int 函数

转载 作者:太空宇宙 更新时间:2023-11-04 05:22:04 24 4
gpt4 key购买 nike

我需要一个函数将 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;
}

最佳答案

对于 24 位字符串:

当您解析十六进制字符串时,标准 strtol 函数会将其读取为 0 -> 2^24 - 1 范围内的无符号值。

范围 0 -> 2^23 - 1 是正确的,但范围 2^23 -> 2^24 - 1 需要映射到 -2^23 -> -1 这是一个简单的减法,可以按如下方式执行。

if (result >= (1L << 23))
result -= (1L << 24);

要使用相同的技术转换 32 位字符串,您必须使用一种中间类型,该中间类型可以在有符号类型中表示完整的 32 位无符号整数以执行减法。 long long int 保证为 64 位,因此您可以使用它。

例如

long int ParseHexStr(const char *in, int bits)
{
char* endptr;
long long int result;

result = strtoll(in, &endptr, 16);

/*
** TODO - error checking, e.g. check endptr != in
** Also check for range errors, signalled by LLONG_MIN
** LLONG_MAX and a errno == ERANGE.
*/

if (result >= (1LL << (bits - 1))
result -= (1LL << bits);

return result;
}

关于c - 带符号的十六进制字符串到 long int 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2781878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com