关于手机端发送16*16汉字点阵取模相关问题(二)
提醒:在这里要首先明白取模方向是什么意思。下面列举下取模放向及实例
横向扫描与上图“我”字对应 这种取模后取值为 00000100 10000000 00001110 10100000.。。。以此类推
但是发送给硬件需要倒叙即为 00100000 00000001 01110000 00000101.。。依次类推
纵向扫描的一种
只要注意扫描方式跟0,1阵的关系就很容易理解。这种扫描即为 00000100 00100100.。。 按照0,1阵方向取值
同样需要倒叙
下面引入下面这种扫描发送的代码,因为项目用到的是这种,其他种都可以按此思路进行编写
- (void)sendText:(NSString *)str{
FILE* fphzk = NULL;
int offset;
unsigned char buffer[32];
unsigned char key[8] = { 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 };
unsigned char word[3]; // 改成你的转码后的汉字编码//
//文件路径 NSString *path = [[NSBundle mainBundle] pathForResource:@"HZK16" ofType:@""];
fphzk = fopen(path.UTF8String, "rb");
if(fphzk == NULL){
fprintf(stderr, "error hzk16\n");
return;
}
//循环解码 --》因为可能是多个汉字
NSMutableString *sendStr = [NSMutableString string];//
NSMutableString *twoSendStr = [NSMutableString string];
for (int i=0; i<str.length; i++) {
NSString *endStr = [str substringWithRange:NSMakeRange(i, 1)];
Byte *bytes = [self convertStringToGBKStr:endStr]; //汉字ascii编码
word[0] = bytes[0];
word[1] = bytes[1];
offset = (94*(unsigned int)(word[0]-0xa0-1)+(word[1]-0xa0-1))*32;
fseek(fphzk, offset, SEEK_SET);
fread(buffer, 1, 32, fphzk);
NSMutableArray<NSArray *> *ary = [NSMutableArray array];
for(int k=0; k<16; k++){
NSMutableArray<NSString *> *str = [NSMutableArray array];
for(int j=0; j<2; j++){
for(int i=0; i<8; i++){
int flag = buffer[k*2+j]&key[i];
printf("%s", flag?"1":"0");
[str addObject:flag?@"1":@"0"];
}
}
printf("\n");
[ary addObject:str];
}
//开始处理取模方式 --》在这里进行扫描以及取模的计算
NSMutableString *overStr = [NSMutableString string];
for (int i = 0; i < 16; i ++) {
NSMutableString *newStr = [NSMutableString string];
for (int j = 0; j < 8; j ++) {
NSArray *strArr = ary[7-j];
[newStr appendFormat:@"%@",strArr[i]];
}
[overStr appendFormat:@"%@",[self getHexByBinary:newStr]];
}
for (int i = 0; i < 16; i ++) {
NSMutableString *newStr = [NSMutableString string];
for (int j = 0; j < 8; j ++) {
NSArray *strArr = ary[15-j];
[newStr appendFormat:@"%@",strArr[i]];
}
[overStr appendFormat:@"%@",[self getHexByBinary:newStr]];
}
NSLog(@"最终输出的自处穿%@",overStr);
[sendStr appendString:overStr];
}
fclose(fphzk);
fphzk = NULL;
//在这里得到的sendStr即为按该中方式取模后的十六进制字符串
}
可以根据不同需求对方法进行修改。因为想要逻辑简单 所以没有对代码进行优化,方面理解。