我想要计算我通过蓝牙发送的消息的LRC。例如,下面是一条消息:
(消息结构为STX message FS EXT LRC)
02 1212004123422826E0B8C0F000F0A00182620000THYRON SYSTEMS WATFORD UKR 1C 03 60
STX = 02
MESSAGE = 1212004123422826E0B8C0F000F0A00182620000THYRON SYSTEMS WATFORD UKR
FS = 1C
EXT = 03
LRC = 60我要做的是通过对通信消息中除STX字符但包括EXT字符的每个字符执行模2二进制和来计算LRC。
在计算LRC之前,我必须将这个NSString转换为HexaString:
31323132 30303431 32333432 32383236 45304238 43304630 30304630 41303031 38323632 30303030 54485952 4f4e2053 59535445 4d532057 4154464f 52442055 4b521c03
使用的方法:
- (NSString *) stringToHex:(NSString *)str
{
NSUInteger len = [str length];
unichar *chars = malloc(len * sizeof(unichar));
[str getCharacters:chars];
NSMutableString *hexString = [[NSMutableString alloc] init];
for(NSUInteger i = 0; i < len; i++ )
{
[hexString appendFormat:@"%02x", chars[i]];
}
free(chars);
return [hexString autorelease];
}然后我必须把它转换成字节数组。使用的方法:
- (NSData*) hexToBytes:(NSString *) hexaStr {
NSMutableData* data = [NSMutableData data];
int idx;
for (idx = 0; idx+2 <= hexaStr.length; idx+=2) {
NSRange range = NSMakeRange(idx, 2);
NSString * hexStrTmp = [hexaStr substringWithRange:range];
NSScanner* scanner = [NSScanner scannerWithString:hexStrTmp];
unsigned int intValue;
[scanner scanHexInt:&intValue];
[data appendBytes:&intValue length:1];
}
return data;
}然后我试着计算我的LRC,应该是60,如下所示:
- (void) calculateLRC:(NSString *) text {
NSData * data = [self hexToBytes:text];
NSUInteger size = [data length] / sizeof(const char);
const char * array = (const char*) [data bytes];
char checksum = 0;
for( uint32_t i = 0 ; i < size; i++) {
checksum += * array++;
}
NSLog(@"Checksum = %c", checksum);
self.LRC_Check = checksum;
}问题是"checksum“中没有值"60”。有人能帮我一下吗?
提前感谢!
发布于 2012-09-21 20:17:35
我有答案了!
在- (void) calculateLRC:(NSString *) text方法中,我必须替换:
checksum += * array++;通过以下方式:
checksum ^= * array++;我以为在目标C中模数字符是"%“...
发布于 2019-04-18 22:37:15
我需要快速完成这项工作。
这似乎是可行的。.need来做一些严格的测试。
var str = computeLRC(hexString:"373203")
print(str)//返回06
func computeLRC (hexString: String ) -> String {
var checksum : UInt16 = 0
var my = ""
for i in stride(from: 0, to: hexString.count, by: 2) {
let indexStartOfText = hexString.index( hexString.startIndex, offsetBy: i)
let indexEndOfText = hexString.index( indexStartOfText, offsetBy: 2)
let substring3 = hexString[indexStartOfText..<indexEndOfText]
let intResult = Int(String(substring3) , radix: 16)
guard let myUnicodeScalar = UnicodeScalar(intResult!) else {
return ""
}
// convert UnicodeScalar to Character
let myCharacter = Character(myUnicodeScalar)
my += String(myCharacter)
}
for myChar in my {
var byte: UInt16 = Array(String(myChar).utf16)[0]
checksum ^= byte
}
return String(format:"%02X", checksum)
}https://stackoverflow.com/questions/12512071
复制相似问题