CAPL脚本中常用到的数据类型转换—— 字节数组(byte array)和整型(long,dword...
实际工作中,常常会遇到需要把 0x12345678 转为 arrary[4] = {0x12,0x34,0x56,0x78} 或者反过来转换,下面造了几个轮子方便使用。
字节数组和整型互转
- 字节数组转为整型
- byte array to dword
- byte array to long
- byte array to word
- byte array to int
- 测试代码:
- 测试结果:
- 整型转为字节数组
- dword to byte array
- word to byte array
- 测试代码:
- 测试结果:
字节数组转为整型
byte array to dword
byte GBF_ConvertByteArrToDword(byte hexRawData[], byte length, dword& outDWord) { int i; byte retVal; if (length > 4) { retVal = gcNok; } else { retVal = gcOk; } outDWord = 0; for(i=0;i<length;i++) { outDWord = outDWord << 8; outDWord = outDWord + hexRawData[i]; } return retVal; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
byte array to long
byte GBF_ConvertByteArrToLong(byte hexRawData[], byte length, long& outDWord)
{
int i;
byte retVal;
if (length > 4)
{
retVal = gcNok;
}
else
{
retVal = gcOk;
}
//reset output
outDWord = 0;
for(i=0;i<length;i++)
{
outDWord = outDWord << 8;
outDWord = outDWord + hexRawData[i];
// outDWord= ~outDWord | 0x80;
}
return retVal;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
byte array to word
byte GBF_ConvertByteArrToword(byte hexRawData[], byte length, word& outWord) { int i; byte retVal; if (length > 2) { retVal = gcNok; } else { retVal = gcOk; } //reset output outWord = 0; for(i=0;i<length;i++) { outWord = outWord << 8; outWord = outWord + hexRawData[i]; } return retVal; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
byte array to int
byte GBF_ConvertByteArrToword(byte hexRawData[], byte length, int& outWord)
{
int i;
byte retVal;
if (length > 2)
{
retVal = gcNok;
}
else
{
retVal = gcOk;
}
//reset output
outWord = 0;
for(i=0;i<length;i++)
{
outWord = outWord << 8;
outWord = outWord + hexRawData[i];
}
return retVal;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
测试代码:
{ byte in_byte_array[4]={0x10,0x20,0x30,0x40}; long out_long; dword out_dword; word out_word; int out_int; GBF_ConvertByteArrToLong(in_byte_array,4,out_long); GBF_ConvertByteArrToDword(in_byte_array,4,out_dword); GBF_ConvertByteArrToword(in_byte_array,2,out_word); GBF_ConvertByteArrToInt(in_byte_array,2,out_int); write('out_long = 0x%x ',out_long); write('out_dword = 0x%x ',out_dword); write('out_word = 0x%x ',out_word); write('out_int = 0x%x ',out_int); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
测试结果:
out_long = 0x10203040
out_dword = 0x10203040
out_word = 0x1020
out_int = 0x1020
1
2
3
4
5
1
2
3
4
5
整型转为字节数组
dword to byte array
byte GBF_ConvertDWordToByteArr(dword rawData, byte outByteArr[]) { char tmpErrStr[255]; byte retOkNok; dword mask = 0x000000FF; //Mask for masking out one byte int i;、 const byte noOfBytes = 4; if (elcount(outByteArr)<noOfBytes ) //check that arraylength is at least 4 { snprintf(tmpErrStr, elcount (tmpErrStr), 'GBF_ConvertDWordToByteArr: ERROR: Length of byte array is to short: %d. Length must be at least %d', elcount(tmpErrStr), 4); write (tmpErrStr); write(tmpErrStr); retOkNok = gcNok; } else { retOkNok = gcOk; for(i=noOfBytes -1;i>=0;i--) { outByteArr[i] = rawData & mask; //Mask one byte and copy it to out array rawData = rawData >> 8; //Shift one byte } } return retOkNok; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
word to byte array
byte GBF_ConvertWordToByteArr(word rawData, byte outByteArr[])
{
char tmpErrStr[255];
byte retOkNok;
word mask = 0x00FF; //Mask for masking out one byte
int i;
const byte noOfBytes = 2;
if (elcount(outByteArr) < noOfBytes) //check that arraylength is at least 2
{
snprintf(tmpErrStr, elcount (tmpErrStr), 'GBF_ConvertWordToByteArr: ERROR: Length of byte array is to short: %d. Length must be at least %d', elcount(tmpErrStr), noOfBytes);
write (tmpErrStr);
write(tmpErrStr);
retOkNok = gcNok;
}
else
{
retOkNok = gcOk;
for(i= noOfBytes-1;i>=0;i--)
{
outByteArr[i] = rawData & mask; //Mask one byte and copy it to out array
rawData = rawData >> 8; //Shift one byte
}
}
return retOkNok;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
测试代码:
{ dword in_dword = 0x12345678; word in_word = 0x1234; byte out_byte_array_dword[4]; byte out_byte_array_word[2]; GBF_ConvertDWordToByteArr(in_dword,out_byte_array_dword); write('out_byte_array_dword ={0x%x,0x%x,0x%x,0x%x} ',out_byte_array_dword[0],out_byte_array_dword[1],out_byte_array_dword[2],out_byte_array_dword[3]); GBF_ConvertWordToByteArr(in_word,out_byte_array_word); write('out_byte_array_word ={0x%x,0x%x} ',out_byte_array_word[0],out_byte_array_word[1]); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
测试结果:
out_byte_array_dword ={0x12,0x34,0x56,0x78}
out_byte_array_word ={0x12,0x34}
1
2
3
1
2
3
赞 (0)