在 C 中减去一个 char 数组减去 int
Substract an char array minus int in C
我有一个字符数组:
char message[];
和一个 8 位整数
uint8_t remainder
我想将两者都视为位数组并像这样减去它们:
message - remainder
并将结果视为字符数组:
一个例子是
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。我认为该方法使用按位运算符,但我还没有想出如何减去它们。
有什么建议吗?
根据要求:
- 从字节数组 (chars) 中读取类型转换整数。请注意,endian 可能会导致它在某些系统上无法正常工作,您可能必须进行 endian swap。另请注意,如果数据未与字边界对齐,某些系统可能会崩溃。
- 比较您的余数与整数。如果整数 >= 余数,则没有进位,您只需减去值并进行类型转换,将整数存储回 char 数组。与上述相同的例外情况。
- 如果余数较大,仍然做减法存储,然后在余数中加1。
- 循环回到 1,读取下一个单词,直到由于没有进位传播或没有要读取的单词而退出。
如果数据未对齐,不是字的大小等,您可能需要按字节执行此操作,但您已声明情况并非如此。
尽情享受吧。
(注意:强烈建议使用 BigNum 类型库而不是自己动手。有一天,这段代码可能需要移植,而这种情况很可能会导致此方法崩溃...)
首先,这样做通常不是一个好主意:-((通常会导致缓冲区溢出)
其次,由于您感兴趣的整数是 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
.
我有一个字符数组:
char message[];
和一个 8 位整数
uint8_t remainder
我想将两者都视为位数组并像这样减去它们:
message - remainder
并将结果视为字符数组:
一个例子是
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。我认为该方法使用按位运算符,但我还没有想出如何减去它们。
有什么建议吗?
根据要求:
- 从字节数组 (chars) 中读取类型转换整数。请注意,endian 可能会导致它在某些系统上无法正常工作,您可能必须进行 endian swap。另请注意,如果数据未与字边界对齐,某些系统可能会崩溃。
- 比较您的余数与整数。如果整数 >= 余数,则没有进位,您只需减去值并进行类型转换,将整数存储回 char 数组。与上述相同的例外情况。
- 如果余数较大,仍然做减法存储,然后在余数中加1。
- 循环回到 1,读取下一个单词,直到由于没有进位传播或没有要读取的单词而退出。
如果数据未对齐,不是字的大小等,您可能需要按字节执行此操作,但您已声明情况并非如此。
尽情享受吧。
(注意:强烈建议使用 BigNum 类型库而不是自己动手。有一天,这段代码可能需要移植,而这种情况很可能会导致此方法崩溃...)
首先,这样做通常不是一个好主意:-((通常会导致缓冲区溢出)
其次,由于您感兴趣的整数是 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
.