[英]C equivalent of the Java “Character.digit(hexText.charAt(i), 16)”
我正在嘗試使用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中的Java Character.digit(hexText.charAt(i), 16)
等效項。 任何人對此有任何想法嗎?
提前致謝。
C沒有與Character.digit
直接等效的Character.digit
,但是由於您的基數被硬編碼為16,因此您可以自己編寫一個:
int hexDigit(char digit) {
static const char *hexDigits = "0123456789ABCDEF";
return strchr(hexDigits, toupper(digit)) - hexDigits;
}
您需要將十六進制字符轉換為它們的實際整數值。 您可以通過從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]);
在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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.