java - C相当于Java "Character.digit(hexText.charAt(i), 16)"

标签 java c hex

我正在尝试使用 C 将十六进制字符串解码回二进制数据。我在 Java 中完成了这件事情,并且在 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 Character.digit(hexText.charAt(i), 16) 的 C 等价物。有人对如何执行此操作有任何想法吗?

提前致谢。

最佳答案

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

int hexDigit(char digit) {
    static const char *hexDigits = "0123456789ABCDEF";
    return strchr(hexDigits, toupper(digit)) - hexDigits;
}

关于java - C相当于Java "Character.digit(hexText.charAt(i), 16)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18724290/

相关文章:

java - XPath:如何使用第二个子节点的值选择子节点

java - 如何遍历对象列表并分配 child ?

java - 如何在 java 中使用 php web 服务

c - 在 Windows api 中的自定义按钮上绘制文本

perl - 在 32 位 perl 中使用 64 位整数和十六进制

c# - 如何在 C# 中将大十进制数转换为十六进制数(例如 : 588063595292424954445828)

java - 如何使用Android通过 key 将文件上传到服务器?

c - 意外的 pipe() 行为

c - 文件路径数组中只有一个元素有效 - C

c# - 将十六进制字符串转换回字符