我正在努力为软件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) 我有std :: string变量.我需要从无符号字符数组中加入一些字节.我知道第一个字节和第一个字节.
我可以使用std :: string :: assign函数.我做到了
但我想使用memcpy函数以正确的方式解决该问题.
std::string newString;
memcpy(&newString, &bytes[startIndex], length);
Run Code Online (Sandbox Code Playgroud)
我知道这是错的.我已经使用std :: vector研究并发现了一些想法.
请帮我找到这个问题最优雅的解决方案.
我的文件中有以下代码:
unsigned char * pData = new unsigned char...
...
if(pData[0] >= 160 && pData[0] <= 255)
Run Code Online (Sandbox Code Playgroud)
当我编译它时,我从编译器(gcc)收到警告:
警告:由于数据类型的范围有限,因此比较始终为真
怎么会这样?不是unsigned char0-255 的范围?我糊涂了.
显然,标准对此没有任何说明,但我对实际/历史观点更感兴趣:使用非二进制补码算法的系统是否使用了char无符号的普通类型?否则你可能有各种各样的怪异,比如null终结符的两个表示,以及无法表示所有"byte"值char.做这么奇怪的系统真的存在吗?
当我用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
#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.
我在打印通过使用任何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) 当编译以下代码时,它进入无限循环:
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被替换为char或int按预期时,代码运行正常,即它终止.
但代码也运行unsigned int良好.因为我有我读的EOF就是定义为-1在stdio.h那为什么此代码为无符号的字符失败,但运行良好的unsigned int类型.
我正在尝试使用第三方库中的函数,并期望输入流对象,其中传输二进制文件数据.
签名看起来像这样:
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
是否有一种简单的方法进行转换char,unsigned char如果您不知道代码运行的机器的默认设置?(在大多数体系结构中,char默认情况下是签名的,因此范围从-128到+127.在其他一些体系结构中,例如ARM,char默认情况下是无符号的,范围从0到255)我正在寻找一种方法来选择正确的签名或透明地转换两者,最好是不涉及太多步骤的一个,因为我需要对数组中的所有元素执行此操作.
使用预处理器定义将允许在我的代码开头设置它.
如将指定的显式形式char,例如signed char或unsigned char作为仅char是平台之间可变.
原因是,我想使用的库函数(例如strtol)接受char as an argument但不是unsigned char.
我正在寻找一些建议,或者正确的方向指出一些实用的高效方法,以便使代码可移植,因为我打算在具有不同默认设置的几台机器上运行代码char.
unsigned-char ×10
c++ ×6
c ×3
c# ×1
char ×1
comparison ×1
copy ×1
eof ×1
fgetc ×1
gcc ×1
istream ×1
marshalling ×1
matrix ×1
memcpy ×1
opencv ×1
pinvoke ×1
portability ×1
stl ×1
vector ×1
warnings ×1