在C中将int转换为ASCII字符
Convert int to ASCII characters in C
C语言中如何将整数值转换为ASCII字符?
我想将字符分配给字符数组。
char buff[10];
假设我们有:
int = 93 (HEX: 5D) -> result should be - buff = {']'}
int = 13398 (HEX: 3456) -> result should be buff = {'4', 'V'}
与完成的类似here
我不需要关心不可打印的字符。总会有可打印的字符。
unsigned u = ...;
if (0x10 > u)
exit(EXIT_FAILURE);
while (0x10000 < u) u /= 2;
while (0x1000 > u) u *= 2;
char c[2] = {u / 0x100, u % 0x100);
将整数值转换为C语言中的ASCII字符?...
引用ASCII table,C中']'
的值将始终被解释为0x5D,或十进制值93。而值C 中的“]”将始终被解释为 NULL
终止的字符数组,即由以下值组成的字符串表示形式:
|93|[=10=]|
(如 This Answer 所示,类似的解释对所有 ASCII 字符都有效。)
要将任何整数 (char
) 值转换为类似于“]”的值,您可以使用字符串函数将 char
值转换为字符串表示形式。例如,所有这些变体都将执行该转换:
char strChar[2] = {0};
sprintf(strChar, "%c", ']');
sprintf(strChar, "%c", 0x5D);
sprintf(strChar, "%c", 93);
并且每个都产生相同的 C 字符串:"]"
.
我想将字符分配给字符数组...
如何创建以 NULL
字符结尾的字符数组的示例,例如 "ABC...Z":
int i;
char strArray[27] = {0};
for(i=0;i<26;i++)
{
strArray[i] = i+'A';
}
strArray[i] = 0;
printf("Null terminated array of char: %s\n", strArray);
只需使用位移位来获取各个字节。
假设 int
大小为 4 的体系结构:
int someInt = ...
uint8_t first = (someInt >> 24);
uint8_t second = (someInt >> 16);
uint8_t third = (someInt >> 8);
uint8_t fourth = someInt;
现在您可以将生成的字节放入数组中。确保首先检查 first
、second
和 third
以确保它们不是 0
,如果是则跳过它们。确保按照 C 字符串的要求以空终止符结束数组。
此答案假定大端排序,因为这是您在示例中指出的。如果你想要小端,只要把它们放入数组时颠倒字节的顺序即可。
请注意,这会将 5DC
变为 05
和 DC
。如果你想要 5D
,你应该检查原始 int
中的第一个数字是否是 0
。您可以使用 &
运算符来执行此操作,针对 0xf0000000
、0x00f00000
等测试 int
。如果您发现第一个数字是 0
,则转移int
在从中提取字节之前向右移动 4 位。
所以,像这样:
void ExtractBytes(int anInt, uint8_t *buf, size_t bufSize) {
// passing an empty buffer to this function would be stupid,
// but hey, doesn't hurt to be idiot-proof
if (bufSize == 0) { return; }
// Get our sizes
const int intSize = sizeof(anInt);
const int digitCount = intSize * 2;
// find first non-zero digit
int firstNonZero = -1;
for (int i = 0; i < digitCount; i++) {
if ((anInt & (0xf << ((digitCount - 1 - i) * 4))) != 0) {
firstNonZero = i;
break;
}
}
if (firstNonZero < 0) {
// empty string; just bail out.
buf[0] = 0;
return;
}
// check whether first non-zero digit is even or odd;
// shift if it's odd
int intToUse = (firstNonZero % 2 != 0) ? (anInt >> 4) : anInt;
// now, just extract our bytes to the buffer
int bufPtr = 0;
for (int i = intSize - 1; i >= 0; i--) {
// shift over the appropriate amount, mask against 0xff
uint8_t byte = (intToUse >> (i * 8));
// If the byte is 0, we can just skip it
if (byte == 0) {
continue;
}
// always check to make sure we don't overflow our buffer.
// if we're on the last byte, make it a null terminator and bail.
if (bufPtr == bufSize - 1) {
buf[bufPtr] = 0;
return;
}
// Copy our byte into the buffer
buf[bufPtr++] = byte;
}
// Now, just terminate our string.
// We can be sure that bufPtr will be less than bufSize,
// since we checked for that in the loop. So:
buf[bufPtr] = 0;
// Aaaaaand we're done
}
现在让我们试一试:
uint8_t buf[10];
ExtractBytes(0x41424344, buf, 10);
printf("%s\n", buf);
ExtractBytes(0x4142434, buf, 10);
printf("%s\n", buf);
和输出:
ABCD
ABC
C语言中如何将整数值转换为ASCII字符? 我想将字符分配给字符数组。
char buff[10];
假设我们有:
int = 93 (HEX: 5D) -> result should be - buff = {']'}
int = 13398 (HEX: 3456) -> result should be buff = {'4', 'V'}
与完成的类似here
我不需要关心不可打印的字符。总会有可打印的字符。
unsigned u = ...;
if (0x10 > u)
exit(EXIT_FAILURE);
while (0x10000 < u) u /= 2;
while (0x1000 > u) u *= 2;
char c[2] = {u / 0x100, u % 0x100);
将整数值转换为C语言中的ASCII字符?...
引用ASCII table,C中']'
的值将始终被解释为0x5D,或十进制值93。而值C 中的“]”将始终被解释为 NULL
终止的字符数组,即由以下值组成的字符串表示形式:
|93|[=10=]|
(如 This Answer 所示,类似的解释对所有 ASCII 字符都有效。)
要将任何整数 (char
) 值转换为类似于“]”的值,您可以使用字符串函数将 char
值转换为字符串表示形式。例如,所有这些变体都将执行该转换:
char strChar[2] = {0};
sprintf(strChar, "%c", ']');
sprintf(strChar, "%c", 0x5D);
sprintf(strChar, "%c", 93);
并且每个都产生相同的 C 字符串:"]"
.
我想将字符分配给字符数组...
如何创建以 NULL
字符结尾的字符数组的示例,例如 "ABC...Z":
int i;
char strArray[27] = {0};
for(i=0;i<26;i++)
{
strArray[i] = i+'A';
}
strArray[i] = 0;
printf("Null terminated array of char: %s\n", strArray);
只需使用位移位来获取各个字节。
假设 int
大小为 4 的体系结构:
int someInt = ...
uint8_t first = (someInt >> 24);
uint8_t second = (someInt >> 16);
uint8_t third = (someInt >> 8);
uint8_t fourth = someInt;
现在您可以将生成的字节放入数组中。确保首先检查 first
、second
和 third
以确保它们不是 0
,如果是则跳过它们。确保按照 C 字符串的要求以空终止符结束数组。
此答案假定大端排序,因为这是您在示例中指出的。如果你想要小端,只要把它们放入数组时颠倒字节的顺序即可。
请注意,这会将 5DC
变为 05
和 DC
。如果你想要 5D
,你应该检查原始 int
中的第一个数字是否是 0
。您可以使用 &
运算符来执行此操作,针对 0xf0000000
、0x00f00000
等测试 int
。如果您发现第一个数字是 0
,则转移int
在从中提取字节之前向右移动 4 位。
所以,像这样:
void ExtractBytes(int anInt, uint8_t *buf, size_t bufSize) {
// passing an empty buffer to this function would be stupid,
// but hey, doesn't hurt to be idiot-proof
if (bufSize == 0) { return; }
// Get our sizes
const int intSize = sizeof(anInt);
const int digitCount = intSize * 2;
// find first non-zero digit
int firstNonZero = -1;
for (int i = 0; i < digitCount; i++) {
if ((anInt & (0xf << ((digitCount - 1 - i) * 4))) != 0) {
firstNonZero = i;
break;
}
}
if (firstNonZero < 0) {
// empty string; just bail out.
buf[0] = 0;
return;
}
// check whether first non-zero digit is even or odd;
// shift if it's odd
int intToUse = (firstNonZero % 2 != 0) ? (anInt >> 4) : anInt;
// now, just extract our bytes to the buffer
int bufPtr = 0;
for (int i = intSize - 1; i >= 0; i--) {
// shift over the appropriate amount, mask against 0xff
uint8_t byte = (intToUse >> (i * 8));
// If the byte is 0, we can just skip it
if (byte == 0) {
continue;
}
// always check to make sure we don't overflow our buffer.
// if we're on the last byte, make it a null terminator and bail.
if (bufPtr == bufSize - 1) {
buf[bufPtr] = 0;
return;
}
// Copy our byte into the buffer
buf[bufPtr++] = byte;
}
// Now, just terminate our string.
// We can be sure that bufPtr will be less than bufSize,
// since we checked for that in the loop. So:
buf[bufPtr] = 0;
// Aaaaaand we're done
}
现在让我们试一试:
uint8_t buf[10];
ExtractBytes(0x41424344, buf, 10);
printf("%s\n", buf);
ExtractBytes(0x4142434, buf, 10);
printf("%s\n", buf);
和输出:
ABCD
ABC