我试图将一个uint8_t数组转换为uint32_t数组,但似乎没有工作.
谁可以帮我这个事.我需要将uint8_t值设为uint32_t.
我可以通过转移来做到这一点,但我认为有一个简单的方法.
uint32_t *v4full;
v4full=( uint32_t *)v4;
while (*v4full) {
if (*v4full & 1)
printf("1");
else
printf("0");
*v4full >>= 1;
}
printf("\n");
Run Code Online (Sandbox Code Playgroud) 所以,我的问题非常简单:
我需要用一些信息填充char/unsigned char数组.中间的一些值取自short/int类型,这就是:
码:
int foo = 15; //0x0000000F
unsigned char buffer[100]={0};
..
memcpy(&buffer[offset], &foo, sizeof(int)); //either memmove
...
Run Code Online (Sandbox Code Playgroud)
输出:
... 0F 00 00 00 ..
Run Code Online (Sandbox Code Playgroud)
所以到现在为止我编写了一个函数来反转这些字段,但我认为这不是一个聪明的解决方案,因为它会影响执行时间,资源和开发时间.
有更简单的方法吗?
编辑:正如你们许多人所指出的,这种行为是由于小端处理器产生的,但我的问题仍然存在.我需要在big-endian中使用int/short值来填充此缓冲区,因为我需要将数据序列化以传输到以小/大端工作的机器,因为此协议已经定义,所以无关紧要.
注意:用于在C++中进行编译
我的任务是使用C将数据文件从big endian转换为little endian,反之亦然。反之,我已经在网上寻找了大约3个小时的其他示例并阅读了我的教科书,但是我对如何开始这一工作非常执着功能。
到目前为止,我的事件顺序是正确的(1到4),但是在convert_and_save函数内部我是否必须使用创建一个char数组?char buffer[4];?
有人可以帮帮我吗?即使您只是提供有关查找内容的线索,我也将不胜感激。
我需要写一个函数:
void convert_and_save(struct record item, FILE * output_handle, int number);
Run Code Online (Sandbox Code Playgroud)
在此函数中,我执行以下一系列步骤:
使用以下方法将整数转换为字符数组:
int integer_to_characters(int number, char * buffer)
{
memcpy(buffer, &number, 4);
}
Run Code Online (Sandbox Code Playgroud)反转该数组中字符的顺序。
使用以下方法将字符数组转换回整数:
int characters_to_integer(char * buffer)
{
int result;
memcpy(&result, buffer, 4);
return result;
}
Run Code Online (Sandbox Code Playgroud)使用以下命令将转换后的记录写入输出文件:
void save_record(FILE * file_handle, struct record a)
{
char output_buffer[size_of_record];
integer_to_characters(a.age, &(output_buffer[0]));
memcpy(&(output_buffer[4]), a.name, 12);
integer_to_characters(a.department, &(output_buffer[16]));
fwrite(output_buffer, sizeof(char), size_of_record, file_handle);
}
Run Code Online (Sandbox Code Playgroud)什么是反转16位和32位整数的字节顺序的最快方法.我经常做类似的事情(这个编码是在C++的Visual Studio中完成的):
union bytes4
{
__int32 value;
char ch[4];
};
union bytes2
{
__int16 value;
char ch[2];
};
__int16 changeEndianness16(__int16 val)
{
bytes2 temp;
temp.value=val;
char x= temp.ch[0];
temp.ch[0]=temp.ch[1];
temp.ch[1]=x;
return temp.value;
}
__int32 changeEndianness32(__int32 val)
{
bytes4 temp;
temp.value=val;
char x;
x= temp.ch[0];
temp.ch[0]=temp.ch[1];
temp.ch[1]=x;
x= temp.ch[2];
temp.ch[2]=temp.ch[3];
temp.ch[3]=x;
return temp.value;
}
Run Code Online (Sandbox Code Playgroud)
有没有更快的方法来做同样的事情,我不需要做那么多的计算?
我正在努力将系统从python转换为c ++.我需要能够在c ++中执行通常使用Python执行的操作struct.unpack(将二进制字符串解释为数值).对于整数值,我可以使用以下数据类型来实现(某种程度)工作stdint.h:
struct.unpack("i", str) ==> *(int32_t*) str; //str is a char* containing the data
Run Code Online (Sandbox Code Playgroud)
这适用于little-endian二进制字符串,但在big-endian二进制字符串上失败.基本上,我需要>在struct.unpack中使用标签的等价物:
struct.unpack(">i", str) ==> ???
Run Code Online (Sandbox Code Playgroud)
请注意,如果有更好的方法,我会全力以赴.但是,我不能使用c ++ 11,也不能使用除Boost之外的任何第三方库.我还需要能够解释浮点数和双打数,就像在struct.unpack(">f", str)和中一样struct.unpack(">d", str),但是当我解决这个问题时我会谈到它.
注意我应该指出,在这种情况下,我的机器的字节顺序是无关紧要的.我知道我在代码中收到的比特流总是大端的,这就是为什么我需要一个始终涵盖大端案例的解决方案.BoBTFish在评论中指出的文章似乎提供了一个解决方案.
如何在C++中的big-endian和little-endian值之间进行转换?我正在使用VC++ 6.0.当我使用_byteswap_ulong()函数时,它需要头文件intrin.h.当我包含标题时,它报告错误说不兼容的编译器,而intrin.h用于gcc编译器.那么除了这个函数之外,还有其他函数可以在VC++中的big-endian和little-endian值之间进行转换吗?
我有一个 big-endian 格式的二进制文件,我正在从中检索 2 位和 4 位整数数据。我正在运行的机器是小端的。
有没有人对从已知格式的二进制文件中提取整数数据并即时切换字节序有任何建议或最佳实践?我不确定我当前的解决方案是否正确:
int myInt;
ifstream dataFile(dataFileLocation, ios::in | ios::binary);
dataFile.seekg(99, ios::beg); //Pull data starting at byte 100;
//For 4-byte value:
char chunk[4];
dataFile.read(chunk, 4);
myInt = (int)(chunk[0] << 24 | chunk[1] << 16 | chunk[2] << 8 | chunk[3]);
//For 2-byte value:
char chunk[2];
dataFile.read(chunk, 4);
myInt = (int)(chunk[0] << 8 | chunk[1]);
Run Code Online (Sandbox Code Playgroud)
这似乎适用于 2 字节数据,但在 4 字节数据上给出了我认为不正确的值。我已经阅读了有关 htonl() 的内容,但从我所读到的内容来看,这并不是实现灵活性的明智之举。
我在comp.lang.c ++上做了一个帖子,得到了这个
但这仍然不是答案.
我对二进制读操作有点困惑.
我试图用流函数读取二进制文件.这是商业程序(ANSYS)的结果文件,我知道文件的结构,至少从手册中知道.
该文件的结构为记录,程序以fortran编写.所以结构就像
记录长度(int)虚拟整数数据(可以是int,double)虚拟整数
第一个记录是100个整数块,其中这对应于上述表示中的数据.
如果我开始读取文件并读取第一个值,即记录长度(整数),我必须交换字节以获得正确的值100.
我不明白为什么我必须交换字节,因为这个文件是在同一台机器上生成的,它们应该使用相同的系统特定例程,所以这不应该是一个问题,但似乎并非如此.还有其他事情正在发生.我无法理解这一点.软件是否可以强制交换字节,我很难理解原因?
任何评论都表示赞赏.
这是一个天真的测试用例
int main () {
ifstream myfile;
char intBuffer[4];
myfile.open ("truss.rst", ios::binary);
myfile.read(intBuffer, sizeof(int));
//cout << *((int*)intBuffer) << endl;
// if I do not use this portion-
// I do not get what I want
char *cptr, tmp;
tmp = intBuffer[0];
intBuffer[0] = intBuffer[3];
intBuffer[3] = tmp;
tmp = intBuffer[1];
intBuffer[1] = intBuffer[2];
intBuffer[2] = tmp;
// -----------------------------
cout << *((int*)intBuffer) << endl;
myfile.close();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最好的,美国
我想要做的事实上应该很简单,但我不知道如何以一种简单的方式实现它:
我想将无符号整数(32位)的值复制到无符号字符数组.数组中的表示必须始终为little endian.
在一个小端架构上我可以简单地做:
unsigned char array[sizeof(unsigned int)];
unsigned int i = 12345;
memcpy(array, &i, sizeof(unsigned int));
Run Code Online (Sandbox Code Playgroud)
该表示将以小尾数表示.在大端架构上实现这一目标的最佳方法是什么?我如何在我的代码中找出我的架构的endianess?
我的项目使用C++ 11标准.
提前致谢!
我有一些表,例如一个声明为 的表uint8_t keyLock[16];,并且我已将这些表的内容保存在我的 MCU 的闪存中。在这个内存中,它看起来像下面这样:
Address Data
00190008 - BA98B694
0019000C - E854B6E7
00190010 - 9200B2C9
00190014 - 42F8B048
Run Code Online (Sandbox Code Playgroud)
memcpy当我通过函数 ( )将闪存数据复制到表中时,memcpy(keyLock, 0x00190008, 32);表的内容最终就像这样初始化的:
keyLock = {
0xBA, 0x98, 0xB6, 0x94, 0xE8, 0x54, 0xB6, 0xE7,
0x92, 0x00, 0xB2, 0xC9, 0x42, 0xF8, 0xB0, 0x48
}
Run Code Online (Sandbox Code Playgroud)
我希望内容就像表是这样初始化的:
keyLock = {
0x94, 0xB6, 0x98, 0xBA, 0xE7, 0xB6, 0x54, 0xE8,
0xC9, 0xB2, 0x00, 0x92, 0x48, 0xB0, 0xF8, 0x42
}
Run Code Online (Sandbox Code Playgroud)
我的调用有什么问题memcpy(),我应该如何编写它以在表格中填充所需的内容,如上所示?
c++ ×9
c ×7
endianness ×5
binary ×1
binaryfiles ×1
bit-shift ×1
byte ×1
c++11 ×1
casting ×1
converters ×1
int ×1
memory ×1
python ×1
swap ×1