标签: unsigned-char

当我需要一个字符串时,我可以用unsigned char*做什么?

假设我有一个unsigned char*,我们称之为:some_data

unsigned char* some_data;
Run Code Online (Sandbox Code Playgroud)

some_data中包含类似url的数据.例如:

"aasdASDASsdfasdfasdf&Foo=cow&asdfasasdfadsfdsafasd"
Run Code Online (Sandbox Code Playgroud)

我有一个函数可以获取'foo'的值,如下所示:

// looks for the value of 'foo'
bool grabFooValue(const std::string& p_string, std::string& p_foo_value)
{
    size_t start = p_string.find("Foo="), end;
    if(start == std::string::npos)
        return false;

    start += 4;
    end = p_string.find_first_of("& ", start);

    p_foo_value = p_string.substr(start, end - start);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

麻烦的是我需要一个字符串传递给这个函数,或者至少一个char*(可以转换为字符串没问题).

我可以通过强制转换解决这个问题:

reinterpret_cast<char *>(some_data)
Run Code Online (Sandbox Code Playgroud)

然后把它传递给函数okie-dokie

...

直到我使用valgrind并发现这可能导致细微的内存泄漏.

Conditional jump or move depends on uninitialised value(s)  __GI_strlen
Run Code Online (Sandbox Code Playgroud)

从我收集的内容来看,它与重新解释的内容有关,搞乱了表示字符串结尾的空值.因此,当c ++试图找出字符串的长度时,搞砸了.

鉴于我无法改变some_data由unsigned char*表示的事实,有没有办法使用我的grabFooValue函数而没有这些微妙的问题?

我更喜欢保留我已经拥有的值查找函数,除非有明显更好的方法来从这个(有时很大的)unsigned char*中删除foo值.

尽管unsigned char*some_data的变化很大,有时也很大,我可以假设'foo'的值在早期的某个地方,所以我的想法是尝试获得前面X个字符的char*无符号的字符*.这可能通过让我设置char*结束的位置来消除字符串长度问题.

我尝试使用strncpy和cast的组合,但到目前为止还没有骰子.有什么想法吗?

c++ string casting unsigned-char

3
推荐指数
1
解决办法
398
查看次数

为什么打印无符号字符有时会起作用,有时不起作用?在C.

对于一个学校项目,我正在写一个河豚加密(只是加密,而不是解密).我已经完成了加密,我决定将解密用于娱乐(在Blowfish中很容易).

我使用无符号字符来表示字节(尽管我认为uint8_t会更便携).当我试图打印出解密的字节时,我遇到了这个问题.我正在加密纯文本消息.我已经能够打印出我加密的实际文本消息,但只能在非常具体的位置打印出来.相同的确切代码似乎无法在其他任何地方工作.这里是:

int n;
for(n = 0; n < numBlocks; n++) // Blocks are 32-bit unsigned ints (unsigned long)
{
     // uchar is just a typedef for unsigned char
     // message is an array of uchars
     message[n] = (uchar) ((blocks[n]>>24));
     message[n+1] = (uchar) ((blocks[n]>>16));
     message[n+2] = (uchar) ((blocks[n]>>8));
     message[n+3] = (uchar) ((blocks[n]));
     // Printing works here; exact message comes back
     printf("%c%c%c%c", message[n], message[n+1], message[n+2], message[n+3]); 
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用两行完全相同的代码时,它不起作用.

for(n = 0; n < numBlocks; n++)
{
     // Printing doesn't …
Run Code Online (Sandbox Code Playgroud)

c printf unsigned char unsigned-char

3
推荐指数
1
解决办法
409
查看次数

无符号字符到char*和C中的int?

处理一些需要在函数中使用unsigned char的加密,但希望在解密后转换为char以供使用.所以我有:

unsigned char plaintext[16];
char *plainchar;
int plainint;

... Code now populates plaintext with data that happens to all be plain text
Run Code Online (Sandbox Code Playgroud)

现在在这一点上,让我们说明文实际上是一个"0123456789"的数据字符串.如何将明文的值作为"012456789"获取为plainchar,同时将plainint作为123456789?

- 编辑 -

当明文等于"AAAAAAAAAA105450"时执行此操作:

unsigned char plaintext[16];
char *plainchar;
int plainint;

... Code now populates plaintext with data that happens to all be plain text

plainchar = (char*)plaintext;
Run Code Online (Sandbox Code Playgroud)

使plainchar等于"AAAAAAAAAA105450╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠┤∙7",sizeof = 51.加密代码是rijndael示例代码,所以它应该工作正常.

谢谢,本

c int char visual-studio-2010 unsigned-char

3
推荐指数
1
解决办法
3955
查看次数

比较非null终止的char数组

我有一个unsigned char已知大小的压缩数组.由于压缩因素,我不会在最后存储空终止符.我想将它与另一个相同格式的数组进行比较.最好的方法是什么?

我想将比较的数组复制到一个新数组,添加空终止符,然后使用它们进行比较strcmp().

有更好的建议吗?

c compression arrays unsigned-char

3
推荐指数
1
解决办法
6150
查看次数

使用C++中的十六进制值初始化unsigned char数组

我想用16个十六进制值初始化一个unsigned char数组.但是,我似乎不知道如何正确初始化/访问这些值.当我试图直观地访问它们时,我根本没有任何价值.

这是我的输出

The program was run with the following command: 4
Please be a value! -----> p
Here's some plaintext 
Run Code Online (Sandbox Code Playgroud)

使用以下代码运行时 -

int main(int argc, char** argv)
{
  int n;
  if (argc > 1) {
    n = std::stof(argv[1]);
  } else {
    std::cerr << "Not enough arguments\n";
    return 1;
  }

  char buff[100];
  sprintf(buff,"The program was run with the following command: %d",n);
  std::cout << buff << std::endl;

unsigned char plaintext[16] = 
   {0x0f, 0xb0, 0xc0, 0x0f,
    0xa0, 0xa0, 0xa0, 0xa0,
    0x00, 0x00, …
Run Code Online (Sandbox Code Playgroud)

c++ arrays hex unsigned-char

3
推荐指数
1
解决办法
3万
查看次数

char和unsigned char有什么区别?

(编辑改变C/C++到C)

请帮我找出一个干净的澄清char,并unsigned char在C.特别是当我们转移嵌入式设备和一般的PC(缓冲区之间的差异之间的数据unsigned char和平原char).

c char unsigned-char

3
推荐指数
1
解决办法
9600
查看次数

将basic_string <unsigned char>转换为basic_string <char>,反之亦然

从以下

我可以将unsigned char转换为char,反之亦然吗?

似乎将a转换basic_string<unsigned char>为a basic_string<char>(即std::string)是有效的操作.但我无法弄清楚该怎么做.

例如,哪些功能可以执行以下转换,填写这些假设stouutos功能的功能?

typedef basic_string<unsigned char> u_string;
int main() {
    string s = "dog";
    u_string u = stou(s);
    string t = utos(u);
}
Run Code Online (Sandbox Code Playgroud)

我试图使用reinterpret_cast,static_cast和其他一些人,但我对其预期功能的了解是有限的.

c++ string casting unsigned-char

3
推荐指数
1
解决办法
901
查看次数

for(unsigned char i = 0; i <= 0xff; i ++)产生无限循环

为什么以下c代码最终会进入无限循环?

for(unsigned char i = 0; i <= 0xff; i++){}
Run Code Online (Sandbox Code Playgroud)

与以下结果相同:

for(unsigned char i = 0; i <= 0xff; ++i){}
Run Code Online (Sandbox Code Playgroud)

我必须以哪种方式修改代码,以使其按预期工作(不使用intunsigned int数据类型)?

c loops unsigned-char

3
推荐指数
3
解决办法
1138
查看次数

以下代码是否存在内存泄漏?

    unsigned char *bin_data;
    unsigned char *bin_model;

    bin_data = new unsigned char[200];
    memset(bin_data, 0, 200);
    bin_model = new unsigned char[200];
    memset(bin_model, 0, 200);
Run Code Online (Sandbox Code Playgroud)

我正在审查上面的代码,我有一种直觉,它可能会导致内存泄漏,但我逻辑上找不到原因.

我认为这是因为我们将memset指向0,数据的地址可能会丢失.我们想要做的只是在从接口获取数据之前初始化bin_data和bin_model,这将用于进一步处理,因为获取数据有可能失败.

上面的代码会导致任何问题吗?

谢谢!

c++ memory-leaks initialization memset unsigned-char

3
推荐指数
1
解决办法
119
查看次数

指向C中不同数据类型的指针

我已经在C中编译并运行以下程序:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(int argc, char* argv[]){
  uint8_t data[8] = {0, 1, 2, 3, 4, 5, 6, 7};
  uint32_t* pointer32 = &data[0];
  uint64_t* pointer64 = &data[0];

  printf("%" PRIu64 "\n", *pointer64);
  printf("%" PRIu32 "\n", *(pointer32++));
  printf("%" PRIu32 "\n", *pointer32);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

并收到以下预期输出:

506097522914230528
50462976
117835012
Run Code Online (Sandbox Code Playgroud)

输出是正确的,并且对应于数据的按位解释为无符号的64位整数和无符号的32位整数。我在运行Ubuntu 14.04的64位计算机上尝试了此操作。它是用普通的gcc编译器(4.8.4?)编译的。编译器的确发出“来自不兼容指针类型的赋值”警告(可以放心地忽略它,因为有意使用不兼容的赋值)。

这是一种转换和解释“数据”数组中数据的可靠方法,还是更好地建议手动将每个字节一次复制并移位到一个临时变量中?

c pointers unsigned-char unsigned-integer

2
推荐指数
1
解决办法
1273
查看次数