代码之家  ›  专栏  ›  技术社区  ›  Joozty

在C中将int转换为ASCII字符

  •  0
  • Joozty  · 技术社区  · 7 年前

    如何在C语言中将整数值转换为ASCII字符? 我想给字符数组分配字符。

    char buff[10];
    

    假设我们有:

    int = 93  (HEX: 5D) -> result should be - buff = {']'} 
    
    int = 13398 (HEX: 3456) -> result should be buff = {'4', 'V'}
    

    与所做的类似 here

    我不需要关心不可打印的字符。将始终存在可打印的字符。

    3 回复  |  直到 7 年前
        1
  •  4
  •   Charles Srstka    7 年前

    只需使用位移位即可获得单个字节。

    假设架构的大小 int is 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 相反,您应该检查原始数据中的第一个数字 内景 0 . 您可以使用 & 操作员,测试 内景 反对 0xf0000000 , 0x00f00000 ,等等,如果您发现第一个数字是 0 ,移动 内景 在从中提取字节之前,向右移动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
    
        2
  •  1
  •   ryyker    7 年前

    将整数值转换为C语言中的ASCII字符?。。。

    指的是 ASCII table ,的值 ']' 在C中,将始终被解释为0x5D或十进制值93。而C中的“]”值将始终被解释为 NULL 终止字符数组,即由以下值组成的字符串表示:

    |93|\0|  
    

    (如中所示 This Answer ,类似的解释适用于所有ASCII字符。)

    转换任意整数( char )如果将值转换为类似“]”的值,则可以使用字符串函数转换 烧焦 值转换为字符串表示形式。例如,所有这些变体都将执行该转换:

    char strChar[2] = {0};
    
    sprintf(strChar, "%c", ']'); 
    sprintf(strChar, "%c", 0x5D); 
    sprintf(strChar, "%c", 93);  
    

    并且每个生成相同的C字符串: "]" .

    我想给字符数组分配字符 ...

    如何创建以 无效的 字符,如“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);
    
        3
  •  0
  •   alk    7 年前
    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);