标签: unsigned-char

P/Invoke,c#:unsigned char丢失一个字节

我正在努力为软件SDK的DLL文件,我试图调用一个函数来获取有关软件主机的信息.

在函数想要的结构中有两个unsigned char变量(HostMachineAddress,HostProgramVersion),当我尝试从c#调用它时,我似乎"松散"了最后一个字节...如果我将下面的c#struct中的SizeConst更改为5我确实得到了丢失的字节,但是它导致另一个变量丢失了数据.

有人可以帮我找到解决这个问题的方法吗?也尝试使用类而不是struct导致system.stackoverflow错误

C#Struct

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct sHostInfo
{
    public int bFoundHost;
    public int LatestConfirmationTime;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
    public string szHostMachineName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
    public string HostMachineAddress;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
    public string szHostProgramName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
    public string HostProgramVersion;
}
Run Code Online (Sandbox Code Playgroud)

C#

[DllImport("Cortex_SDK.dll")]
public static extern int GetHostInfo(out sHostInfo pHostInfo);
Run Code Online (Sandbox Code Playgroud)

c# pinvoke marshalling unsigned-char

11
推荐指数
1
解决办法
1027
查看次数

使用memcpy()函数将unsigned char数组中的字节放入std :: string

我有std :: string变量.我需要从无符号字符数组中加入一些字节.我知道第一个字节和第一个字节.

我可以使用std :: string :: assign函数.我做到了

但我想使用memcpy函数以正确的方式解决该问题.

std::string newString;
memcpy(&newString, &bytes[startIndex], length);
Run Code Online (Sandbox Code Playgroud)

我知道这是错的.我已经使用std :: vector研究并发现了一些想法.

请帮我找到这个问题最优雅的解决方案.

c++ stl memcpy unsigned-char

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

为什么这种比较总是如此?

我的文件中有以下代码:

unsigned char * pData = new unsigned char...

...

if(pData[0] >= 160 && pData[0] <= 255)
Run Code Online (Sandbox Code Playgroud)

当我编译它时,我从编译器(gcc)收到警告:

警告:由于数据类型的范围有限,因此比较始终为真

怎么会这样?不是unsigned char0-255 的范围?我糊涂了.

c++ warnings unsigned-char

9
推荐指数
2
解决办法
3368
查看次数

普通字符在非二进制补码系统上通常/总是无符号吗?

显然,标准对此没有任何说明,但我对实际/历史观点更感兴趣:使用非二进制补码算法的系统是否使用了char无符号的普通类型?否则你可能有各种各样的怪异,比如null终结符的两个表示,以及无法表示所有"byte"值char.做这么奇怪的系统真的存在吗?

c twos-complement unsigned-char

9
推荐指数
2
解决办法
695
查看次数

使用运算符<< = on unsigned char时的-wconversion警告

当我用gcc编译以下代码时:

int main()
{
  unsigned char c = 1;
  c <<= 1;  // WARNING ON THIS LINE
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到这个警告:

conversion to ‘unsigned char’ from ‘int’ may alter its value [-Wconversion]

为什么?这段代码有什么问题?实际上,我真的可以在变量<<=上使用oprator unsigned char吗?

编译命令:

g++ test.cpp -Wconversion -o test.exe

c++ gcc bitwise-operators unsigned-char

9
推荐指数
1
解决办法
347
查看次数

无符号字符的最大值

#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    printf("%d",i<<1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么这个程序打印256?

据我所知,由于0x80 = 0b10000000,无符号字符有8位,因此左移后'1'应溢出,输出应为0,而不是256.

c bit-manipulation unsigned-char

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

打印关键点描述符矩阵opencv的值

我在打印通过使用任何opencv描述符提取器的'compute'方法获得的描述符矩阵的值时遇到一些麻烦.我想逐个打印一个特征的描述符,但是当我用'at'访问描述符矩阵的某个元素时,我会收到该元素的不同值.以下是'for'循环,用于在使用'at'时测试描述符矩阵的输出值:

for(int i=0; i<nF; i++){

    if(lpx != keypoints[i].pt.x && lpy != keypoints[i].pt.y){
        usedFeatures++;
        cerr << descriptors.row(i) << endl << endl; // printing row of descriptor matrix
        fileS << keypoints[i].pt.y << " " << keypoints[i].pt.x << " ";
        fileS << keypoints[i].size << " " << keypoints[i].angle << endl;

        if(i == nF - 2){
            //printing subvector of descriptor matrix made of the element at row i and col 0
            cerr << "get row i, col 0 " << descriptors.row(i).col(0) << endl;

            //same …
Run Code Online (Sandbox Code Playgroud)

c++ opencv matrix unsigned-char feature-descriptor

8
推荐指数
1
解决办法
8121
查看次数

比较unsigned char和EOF

当编译以下代码时,它进入无限循环:

int main()
{
    unsigned char  ch;
    FILE *fp;
    fp = fopen("abc","r");
    if(fp==NULL)
    {
        printf("Unable to Open");
        exit(1);
    }
    while((ch = fgetc(fp))!=EOF)
    printf("%c",ch);
    fclose(fp);
    printf("\n",ch);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc编译器也会在编译时发出警告

abc.c:13:warning: comparison is always true due to limited range of data type
Run Code Online (Sandbox Code Playgroud)

当代码unsigned char被替换为charint按预期时,代码运行正常,即它终止.
但代码也运行unsigned int良好.因为我有我读的EOF就是定义为-1stdio.h那为什么此代码为无符号的字符失败,但运行良好的unsigned int类型.

c comparison eof unsigned-char fgetc

7
推荐指数
2
解决办法
8742
查看次数

方便地将std :: vector <unsigned char>复制到输入流(std :: istream)对象

我正在尝试使用第三方库中的函数,并期望输入流对象,其中传输二进制文件数据.

签名看起来像这样:

doSomething(const std::string& ...,
          const std::string& ...,
          std::istream& aData,
          const std::string& ...,
          const std::map<std::string, std::string>* ...,
          long ...,
          bool ...);
Run Code Online (Sandbox Code Playgroud)

由于我不能改变/改变这个第三方的lib /功能,我必须适应"我的"代码.在调用的地方,我有一个std :: vector,它包含了预期在istream对象中传递的数据.目前,我将向量复制到流中,通过迭代并使用<<运算符逐字节复制.

我强烈怀疑可能有一种更有效/方便的方式,但迄今为止找不到任何有用的东西.非常感谢任何帮助/您的想法.

最好,JR

c++ copy vector istream unsigned-char

7
推荐指数
2
解决办法
7788
查看次数

在C++中键入"char"

是否有一种简单的方法进行转换char,unsigned char如果您不知道代码运行的机器的默认设置?(在大多数体系结构中,char默认情况下是签名的,因此范围从-128+127.在其他一些体系结构中,例如ARM,char默认情况下是无符号的,范围从0到255)我正在寻找一种方法来选择正确的签名或透明地转换两者,最好是不涉及太多步骤的一个,因为我需要对数组中的所有元素执行此操作.

使用预处理器定义将允许在我的代码开头设置它.
如将指定的显式形式char,例如signed charunsigned char作为仅char是平台之间可变.

原因是,我想使用的库函数(例如strtol)接受char as an argument但不是unsigned char.

我正在寻找一些建议,或者正确的方向指出一些实用的高效方法,以便使代码可移植,因为我打算在具有不同默认设置的几台机器上运行代码char.

c++ portability char unsigned-char

7
推荐指数
1
解决办法
1098
查看次数