假设我有一个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的组合,但到目前为止还没有骰子.有什么想法吗?
对于一个学校项目,我正在写一个河豚加密(只是加密,而不是解密).我已经完成了加密,我决定将解密用于娱乐(在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) 处理一些需要在函数中使用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示例代码,所以它应该工作正常.
谢谢,本
我有一个unsigned char已知大小的压缩数组.由于压缩因素,我不会在最后存储空终止符.我想将它与另一个相同格式的数组进行比较.最好的方法是什么?
我想将比较的数组复制到一个新数组,添加空终止符,然后使用它们进行比较strcmp().
有更好的建议吗?
我想用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/C++到C)
请帮我找出一个干净的澄清char,并unsigned char在C.特别是当我们转移嵌入式设备和一般的PC(缓冲区之间的差异之间的数据unsigned char和平原char).
从以下
我可以将unsigned char转换为char,反之亦然吗?
似乎将a转换basic_string<unsigned char>为a basic_string<char>(即std::string)是有效的操作.但我无法弄清楚该怎么做.
例如,哪些功能可以执行以下转换,填写这些假设stou和utos功能的功能?
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代码最终会进入无限循环?
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)
我必须以哪种方式修改代码,以使其按预期工作(不使用int或unsigned int数据类型)?
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中编译并运行以下程序:
#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?)编译的。编译器的确发出“来自不兼容指针类型的赋值”警告(可以放心地忽略它,因为有意使用不兼容的赋值)。
这是一种转换和解释“数据”数组中数据的可靠方法,还是更好地建议手动将每个字节一次复制并移位到一个临时变量中?