1

我正在尝试使用 C 将十六进制字符串解码回二进制数据。我已经在 J​​ava 中完成了这件事,并且在 C 中具有等效的编码功能,但不能完全使解码工作。看...

Java代码:

private static String encodeToHex(byte[] bytes) {
    StringBuilder stringBuilder = new StringBuilder();
    for (byte b : bytes) {
        stringBuilder.append(String.format("%02x", b & 0xff));
    }
    return stringBuilder.toString();
}

private static byte[] decodeFromHex(String hexText) {
    int length = hexText.length();
    byte[] data = new byte[length / 2];
    for (int i = 0; i < length; i += 2) {
        data[i / 2] = (byte) ((Character.digit(hexText.charAt(i), 16) << 4) + Character.digit(hexText.charAt(i + 1), 16));
    }
    return data;
}

C代码:

void encodeToHex(const unsigned char *encryptedText, const size_t length, char *hexEncodedText) {
    for (int i = 0; i < length; i++) {
        if (i == 0) {
            sprintf(hexEncodedText, "%02x", encryptedText[i] & 0xff);
        } else {
            sprintf(hexEncodedText + strlen(hexEncodedText), "%02x", encryptedText[i] & 0xff);
        }
    }
}

// The poor attempt. Note, I do not write C like a native
void hexDecode(char *hexEncodedText, unsigned char *decodedCipherText) {
    int length = strlen(hexEncodedText);
    unsigned char data[length / 2];
    for (int i = 0; i < length; i += 2) {
        data[i / 2] = (char) ((hexEncodedText[i] << 4) + (hexEncodedText[i + 1]));
    }
    memcpy(decodedCipherText, data, length / 2);
}

我想我要寻找的是 Java 的 C 等价物Character.digit(hexText.charAt(i), 16)。有人对如何做到这一点有任何想法吗?

提前致谢。

4

3 回答 3

5

C 没有 的直接等价物Character.digit,但由于您的基数被硬编码为 16,您可以自己编写一个:

int hexDigit(char digit) {
    static const char *hexDigits = "0123456789ABCDEF";
    return strchr(hexDigits, toupper(digit)) - hexDigits;
}
于 2013-09-10T16:34:31.297 回答
2

您需要将十六进制字符转换为它们的实际整数值。您可以通过从char文字中减去十六进制字符来做到这一点,如下所示:

unsigned char valueOfHexCharacter(char hex) {
    if (hex >= '0' && hex <= '9')
        return hex - '0';
    else if (hex >= 'a' && hex <= 'f')
        return 10 + (hex - 'a');
    else if (hex >= 'A' && hex <= 'F')
        return 10 + (hex - 'A');
    else
        return -1; // invalid hex character
}

您可以在代码中使用它

data[i / 2] = (valueOfHexCharacter(hexEncodedText[i]) << 4) + valueOfHexCharacter(hexEncodedText[i + 1]);
于 2013-09-10T16:36:06.347 回答
2

在 C 中,您可以用字符的 ASCII 来欺骗。

int hexDigit(char digit) {
    int val = digit - '0';
    if (digit > 'a') { // leave this out if you know its upper case
        val -= 'a' - 'A';
    }
    if (val > '9') {
        val -= "A" - '9' + 1;
    }
    return val;
}
于 2013-09-10T16:36:50.973 回答