我对unsigned char(也在BYTEWinAPI 中)和char指针之间的差异感到有些困惑。
目前我正在处理一些基于 ATL 的遗留代码,我看到了很多如下所示的表达式:
CAtlArray<BYTE> rawContent;
CALL_THE_FUNCTION_WHICH_FILLS_RAW_CONTENT(rawContent);
return ArrayToUnicodeString(rawContent);
// or return ArrayToAnsiString(rawContent);
Run Code Online (Sandbox Code Playgroud)
现在,实现ArrayToXXString看起来如下:
CStringA ArrayToAnsiString(const CAtlArray<BYTE>& array)
{
CAtlArray<BYTE> copiedArray;
copiedArray.Copy(array);
copiedArray.Add('\0');
// Casting from BYTE* -> LPCSTR (const char*).
return CStringA((LPCSTR)copiedArray.GetData());
}
CStringW ArrayToUnicodeString(const CAtlArray<BYTE>& array)
{
CAtlArray<BYTE> copiedArray;
copiedArray.Copy(array);
copiedArray.Add('\0');
copiedArray.Add('\0');
// Same here.
return CStringW((LPCWSTR)copiedArray.GetData());
}
Run Code Online (Sandbox Code Playgroud)
所以,问题:
对于所有可能的情况,从BYTE*到LPCSTR( const char*)的 C 样式转换是否安全?
将数组数据转换为宽字符串时是否真的需要添加双空终止?
转换例程CStringW((LPCWSTR)copiedArray.GetData())对我来说似乎无效,是真的吗?
有什么方法可以使所有这些代码更容易理解和维护?
以下程序:
#include <iostream>
#include <string>
int main ()
{
unsigned char result1 {0};
unsigned char result2 {0};
result1 = (result1 - 1) % 8;
result2 = result2 - 1;
result2 = result2 % 8;
std::cout << "result1 is " << std::to_string (result1) << '\n';
std::cout << "result2 is " << std::to_string (result2) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
result1 is 255
result2 is 7
Run Code Online (Sandbox Code Playgroud)
为什么result1和result2的计算结果不同?
我尝试了几个编译器,但它们都产生相同的结果,所以这一定是我不明白的地方。
我是C++的新手,并且做了一些我认为sprintf可以完成这项工作的谷歌搜索,但是在编译时我得到一个错误,我无法在a unsigned char和a 之间进行转换char.我需要一个unsigned char,因为我打算打印到图像文件(0-255 RGB).
unsigned char*** pixels = new unsigned char**[SIZE];
vector<float> pixelColors;
...
sprintf(pixels[i][j][k], "%.4g", pixelColors.at(k));
Run Code Online (Sandbox Code Playgroud)
(pixelColors的大小为3,'k'指的是'for循环'变量)
我想知道如何生成随机的无符号字符值。我的点子;
rand()%255;因为无符号字符支持在 0-255 之间。我想知道这种方法是否可以改进(或者这是最合法的方法)
我正在将输入raw pcm流转换为mp3使用lame.该库中的编码函数返回mp3类型数组中的编码样本unsigned char.这个mp3编码的流现在需要放在一个flv容器中,该容器使用一个在char数组中写入编码样本的函数.我的问题是我将数组从lame(类型unsigned char)传递到flv库中.以下代码(仅符号)说明了我的问题:
/* cast from unsigned char to char. */
#include <stdio.h>
#include <stdlib.h>
void display(char *buff, int len) {
int i = 0;
for(i = 0; i < len; i++) {
printf("buff[%d] = %c\n", i, buff[i]);
}
}
int main() {
int len = 10;
unsigned char* buff = (unsigned char*) malloc(len * sizeof(unsigned char));
int i …Run Code Online (Sandbox Code Playgroud) 我需要将 unsigned char 数组转换为 unit8_t 数组也许有人知道如何做到这一点?
我试图在互联网上寻找信息,但不幸的是我没有成功。
:)
为什么两个char相似signed char并且unsigned char具有相同的值不相等?
char a = 0xfb;
unsigned char b = 0xfb;
bool f;
f = (a == b);
cout << f;
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,值为f0.
为什么如此当两个a与b具有相同的价值?
很抱歉问这个问题,但我搜索了这个小东西,发现了与以下链接相关的东西,但无法得到任何想法
如何将浮点值(假设 0.00895)存储到无符号字符,稍后用于存储在内存缓冲区中。
后来我需要读回数组并想从内存中读回。
谢谢
我这里有一个非常基本的问题.我尝试了谷歌搜索一段时间,因为有很多类似的问题,但没有一个解决方案适合我.
这是一个显示问题的代码段:
QString test = "hello";
unsigned char* test1 = (unsigned char*) test.data();
unsigned char test2[10];
memcpy(test2,test1,test.size());
std::cout<<test2;
Run Code Online (Sandbox Code Playgroud)
我尝试将QString放入unsigned char数组中,但我得到的输出总是只是'h'.
谁能告诉我这里出了什么问题?
我不确定何时使用无符号字符时我不得不担心溢出.这个案子很清楚:
uint8_t a = 3;
uint8_t b = 6;
uint8_t c = a - b; // c is 253
Run Code Online (Sandbox Code Playgroud)
但是,这里发生了什么:
float d = a - b; // d is -3
Run Code Online (Sandbox Code Playgroud)
在进行减法之前是a还是被转换为float?
或者在这种情况下:
float e = (a - b) + (a - c);
Run Code Online (Sandbox Code Playgroud)
是否所有三个变量都转换为浮点数?
是否有可能发生溢出的情况,即使分配给的变量是浮点数?如果e是float,int或其他什么,规则是否相同?
此外,在这种情况下会发生什么:
int a = std::abs(a - b);
Run Code Online (Sandbox Code Playgroud)