首先,原谅我非常业余的编码知识。 我在一家公司实习,并被指派用C ++创建一个交换字节的代码,以获得正确的校验和值。
我正在阅读类似于以下内容的列表: S315FFF200207F7FFFFF42A000000000001B000000647C S315FFF2003041A00000FF7FFFFF0000001B00000064ED S315FFF2004042480000FF7FFFFF0000001E000000464F
我已经让程序将此字符串转换为十六进制,然后是int,以便可以正确读取它。我不是在阅读每行的前12个字符或最后2个字符。
我的问题是如何让转换后的int做一个字节交换(小端到大端),以便它对计算机可读? 如果这是一个可怕的解释,我很抱歉。
编辑:我需要基本上取每个字节(4个字母)并翻转它们。即:64C7翻转到C764等等等。我怎么做这个并把它放到一个新的阵列?现在每一行都是一个字符串...
EDIT2:截至目前,这是我的代码的一部分......
int j = 12;
for (i = 0; i < hexLength2 - 5; i++){
string convert1 = ODL.substr(j, 4);
short input_int = stoi(convert1);
short lowBit = 0x00FF & input_int;
short hiBit = 0xFF00 & input_int;
short byteSwap = (lowBit << 8) | (hiBit >> 8);
我想我可能需要以某种方式将我的STOI转换为短片。
EDIT3:使用下面的答案代码,我得到以下内容...... HEX:8D - &gt;存储到内存(myMem = unsigned short)为141(十进制) - &gt;当字节交换时:-29440 这有什么不对吗?
for (i = 0; i < hexLength2 - 5; i++){
string convert1 = ODL.substr(j, 2);
stringstream str1;
str1 << convert1;
str1 >> hex >> myMem[k];
short input_int = myMem[k]; //byte swap
short lowBit = 0x00FF & input_int;
short hiBit = 0xFF00 & input_int;
short byteSwap = (lowBit << 8) | (hiBit >> 8);
cout << input_int << endl << "BYTE SWAP: " <<byteSwap <<"Byte Swap End" << endl;
k++;
j += 2;
答案 0 :(得分:1)
如果你问我认为你在问什么 -
首先,您需要确保知道整数的大小。 32位是很好的标准,但检查并确保。
其次,将整数数组转换为char数组。现在,您可以一次访问和操作一个字节的数组。
第三 - 只需反转每四个字节的顺序(在前12个字符偏移之后)。交换第一和第四,第二和第三。
答案 1 :(得分:1)
你也可以按位进行。 (假设16位字)例如,如果你进行字节交换int:
short input_int = 123; // each of the ints that you have
short input_lower_half = 0x00FF & input_int;
short input_upper_half = 0xFF00 & input_int;
// size of short is 16-bits, so shift the bits halfway in each direction that they were originally
short byte_swapped_int = (input_lower_half << 8) | (input_upper_half >> 8)
编辑:我确实尝试使用您的代码
unsigned short myMem[20];
int k = 0;
string ODL = "S315FFF2000000008DC7000036B400003030303030319A";
int j = 12;
for(int i = 0; i < (ODL.length()-12)/4; i++) { // not exactly sure what your loop condition was
string convert1 = ODL.substr(j, 4);
cout << "substring is: " << convert1 << endl;
stringstream str1;
str1 << convert1;
str1 >> hex >> myMem[k];
short input_int = myMem[k]; //byte swap
unsigned short lowBit = 0x00FF & input_int; // changed this to unsigned
unsigned short hiBit = 0xFF00 & input_int; // changed this to unsigned
short byteSwap = (lowBit << 8) | (hiBit >> 8);
cout << hex << input_int << " BYTE SWAPed as: " << byteSwap <<", Byte Swap End" << endl;
k++;
j += 4;
}
唯一重要的是将loBit和hiBit更改为无符号,因为这些是我们正在使用的临时值。