繁体   English   中英

如何在C上设置无符号char数组的值

[英]How to set value of unsigned char array on C

我有一个大小为64的无符号char数组,我想在运行时更改其值,但是我的所有尝试都不幸失败了,我在做什么错?

int main() {
  unsigned char buffer[64]={0xef,0xaa,0x03,0x05,0x05,0x06,0x07,0x08,......};
  buffer = {0x01,0x04,0xa0,0xb0,0xde,0x00,.....}; //fails

  return 0;
}

编辑:我不想用零填充的数组缓冲区,我想放置一个新值

另一个解决方案是使用全能的memcpy()和C99复合文字:

memcpy(array, (int []){ 0x00, 0x01, 0x02 }, sizeof array);

信不信由你, 这行得通

    for (int i = 0; i < 64; ++i) buffer[i] = 0x00;

或在C ++(11或更高版本)中,您可以使用std :: fill_n或std :: generate_n

     std::fill_n(buffer, 64, 0x00);

要么

      for (auto &b : buffer) b = 0x00;

从您的评论中,我看到您不想访问数组的元素。 如果没有,那么这里是您问题的另一种解决方案。

您可以在内存池上声明缓冲区。 因此,

unsigned char *buffer = malloc( sizeof( unsigned char ) * 64 );

...然后,如果您想替换数组的所有元素(就像您尝试使用数组初始化语法所做的那样),则可以按以下步骤完成:

memset( buffer, 0x00, sizeof( unsigned char ) * 64 ); // To replace buffer = { 0x00, ..., 0x00 };.
memset( buffer, 0, sizeof( unsigned char ) * 64 ); // To replace buffer = '0...0';.

遗产:

如果要使用在堆栈上声明的数组,则需要使用方括号[ ]一次将其更改一个元素。 可以按照以下步骤进行:

for ( int i = 0; i < 64; i++ ) {
  buffer[ i ] = val; // where "val" is some value.
}

使用std::memset

memset(buffer, 0, sizeof(buffer));

还有bzero ,但这是一个遗留函数,因此不应在新开发中使用它。

您可以通过两种方式更改元素的值:

unsigned char buffer[64]={0xef,0xaa,0x03,0x05,0x05,0x06,0x07,0x08,......};

buffer[0] = 0;
buffer[1] = 15;
// etc ...

// C++11 for-loop range works fine to :
for ( auto &c : buffer )
    c = 0;

或之后,您可以使用以下函数: memsetstd::fill_n

memset( buffer, 0, sizeof(buffer) );
std::fill_n( buffer, 64, 0x00 );

您可以使用snprintf

#include <stdio.h>

int main() {
  unsigned char buffer[64]={0};
  snprintf(buffer, 64, "Hello World!\x0D\x0A");
  printf(buffer);
}

输出:

$ ./a.out | hexdump -C
00000000  48 65 6c 6c 6f 20 57 6f  72 6c 64 21 0d 0a        |Hello World!..|
0000000e

尽管语法相似,但是初始化和赋值是两个不同的操作。

int x[4] = { 1, 2, 3, 4}; // initialization
x = { 1, 2, 3, 4}; // assignment

此外,C和C ++中的原始数组的行为也很奇怪,尤其是有一条特殊的规则规定它们不可分配:

int x[4];
int y[4];

y = x; // error, arrays are not assignable

因此,即使您创建数组临时对象,也无法使用赋值运算符简单地将其复制到另一个数组对象中。

相反,如果您设置使用原始数组,则必须使用memcpyfill等单独设置每个数组元素。


更好的解决方案是使用C ++和除允许分配的原始数组之外的其他类型,例如std::array<unsigned char, 64>

std::array<unsigned char, 64> buffer = {0xef,0xaa,0x03,0x05,0x05,0x06,0x07,0x08};
buffer = {}; // zeros out the array

通常, std::array模板的行为就像普通对象一样,而C和C ++中的原始数组在语言规范中具有所有这些非常奇怪的行为和特殊情况。 您应该避免使用原始数组。


不幸的是,C不能替代原始数组。

由于这是一些编译器问题,请尝试简单使用memcpy()

#include <string.h>
int main() {
  unsigned char bufferTo[  64]={0xef,0xaa,0x03,0x05,0x05,0x06,0x07,0x08,......};
  unsigned char bufferFrom[64]={0x01,0x04,0xa0,0xb0,0xde,0x00,.....};
  memcpy(bufferTo, bufferFrom, 64);
  return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM