【问题标题】:Substract an char array minus int in C在 C 中减去一个 char 数组减去 int
【发布时间】:2020-08-12 18:18:34
【问题描述】:

我有一个字符数组:

char message[];

还有一个 8 位整数

uint8_t remainder

我想将两者都视为位数组并将它们相减:

message - remainder

并将结果视为 char 数组:

一个例子是

char* message = "ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ";
// Equivalent to a 512-bit array of only 1s

uint8_t remainder = 1;
// Substract here message-remainder

printf("%s", message)
// Output: "ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ"
// As the 512 bit array would still be just 1s except for the first bit which now is 0, so the first char would be 254 instead of 255

有没有可能的方法呢? 我曾考虑将 char 数组转换为 int,但问题是它通常是 64 字节数组,所以我不能将其视为 int。我认为这种方法可以使用按位运算符,但我还没有想出如何减去它们。

有什么建议吗?

【问题讨论】:

  • 如果您在问题中添加示例(示例字符数组、余数以及您希望在该示例末尾返回的内容),它可能会帮助人们回答。另外,您说的是“64 字节”数组 - 我只是想确保您的意思是 64 字节而不是 64 位。
  • 所以你想把消息当作一个“大”整数? BigNum 库可以为您做到这一点。否则,您减去第一个字符,然后减去每个剩余字符的进位。在 asm 中更容易完成,但可以在 C 的帮助下完成。
  • 你也不必按字符来做,只要你小心不要在你的消息数组之外阅读,你可以按“单词”来做。 (将 8 个字符转换为 64 位整数 - 字节序注意,如果余数小于整数减去余数并完成。如果大于,则减去,然后将下一个 8 字节转换为整数并传播进位。继续直到没有进位或没有字符转换)
  • @thisisbenmanley 添加了示例,是的,我的意思是 64 字节。
  • 第一次循环,如果余数

标签: c arrays char bit-manipulation bitwise-operators


【解决方案1】:

根据要求:

  1. 从字节数组(字符)中读取为类型转换的整数。请注意,endian 可能会导致它在某些系统上无法正常工作,您可能必须进行 endian 交换。另请注意,如果数据未与字边界对齐,某些系统可能会崩溃。
  2. 将余数与整数进行比较。如果整数 >= 余数,则没有进位,您只需减去值并将整数类型转换存储回 char 数组。上述例外情况相同。
  3. 如果余数较大,仍执行减法并存储,但将 1 放入余数。
  4. 循环回到 1,读取下一个单词,直到您退出,因为没有进位传播或没有要读取的单词。

如果数据不对齐,不是字长等,您可能需要按字节执行此操作,但您已声明不是这种情况。

享受吧。

(注意:强烈建议使用 BigNum 类型库,而不是自己动手。总有一天,这段代码可能需要移植,而且这种方法很可能会在发生这种情况时中断......)

【讨论】:

    【解决方案2】:

    首先,这样做通常是个坏主意:-((通常会导致一些缓冲区溢出)

    其次,由于您感兴趣的整数是 8 位整数,因此它与单个 char 的大小相同。因此,如果您确实想实现它,只需这样做:

    if (message[strlen(message)-1]<integer){
        for (int i=strlen(message);i>0;i--){
            if (message[i-1]){
                message[i-1]--;
                for (j=i+1;j<strlen(message)-1;j++){
                    message[j]=255;
                }
                message[strlen(message)-1]=(char)((int)(message[strlen(message)-1])+255-remainder);
                break;
            }
        }
        /* ERROR - message is less than remainder */
    }
    else{
        message[strlen(message)-1]-=remainder;
    }
    

    你就完成了。

    请注意,(char)((int)(message[strlen(message)-1])+255-remainder) 部分可能不是必需的;我写它只是为了确保在执行加法和减法时,所有内容都被转换为int

    【讨论】:

      猜你喜欢
      • 2022-06-11
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      相关资源
      最近更新 更多