我想将颜色代码从rgb(示例输入为255,255,255
)转换为类似[ 0xFF, 0xFF, 0xFF ]
的字节数组。
我该怎么做呢?
我的第一次尝试是,拆分RGB-Sections并将其解析为HEX Color并将其转换为整数:
this.addColor = function addColor(buffer, color) {
var parts = color.split(',');
var red = parts[0].toString(16);
var green = parts[1].toString(16);
var blue = parts[2].toString(16);
buffer.writeByte(parseInt("0x" + (red.length == 1 ? "0" + red : red, 16)));
buffer.writeByte(parseInt("0x" + (green.length == 1 ? "0" + green : green, 16)));
buffer.writeByte(parseInt("0x" + (blue.length == 1 ? "0" + blue : blue, 16)));
};
原始如下,但我想动态制作:
buffer.writeByte('f'); // These Char says "its a foreground color"
buffer.writeByte(0xFF); // Red
buffer.writeByte(0xFF); // Green
buffer.writeByte(0xFF); // Black
结果将输出为fÿÿÿ
!
答案 0 :(得分:0)
由于buffer.writeByte()
期望字节值为整数值,因此您只需将字符串中的值解析为假设十进制格式的整数。十六进制在此处不起作用,直到您希望稍后使用十六进制格式将字节值表示为字符串。
this.addColor = function addColor(buffer, color)
{
var parts = color.split(',');
for (var i=0; i<parts.length; i++)
{
var itemAsString = parts[i];
buffer.writeByte(parseInt(itemAsString, 10));
}
};
提供更详细的解释。您的原始代码
buffer.writeByte('f'); // These Char says "its a foreground color"
buffer.writeByte(0xFF); // Red
buffer.writeByte(0xFF); // Green
buffer.writeByte(0xFF); // Black
也可以写成
buffer.writeByte('f'); // These Char says "its a foreground color"
buffer.writeByte(255); // Red
buffer.writeByte(255); // Green
buffer.writeByte(255); // Black
这在语义上是相同的。因此,您不需要在任何地方使用十六进制,只需将字符串解析为整数即可。
更强大的版本,处理多于或少于三个传递的参数。
this.addColor = function addColor(buffer, color)
{
var parts = color.split(',');
var maxBytes = Math.min(parts.length, 3);
for (var i=0; i < maxBytes; i++)
{
var itemAsString = parts[i];
buffer.writeByte(parseInt(itemAsString, 10));
}
// Write 0 bytes for missing parts
for (var i=parts.length; i < 3; i++)
{
buffer.writeByte(0);
}
};
答案 1 :(得分:0)
不确定您在buffer
中撰写的内容,但如果您只想将decimal array
转换为hex string array
,
您可以尝试:
arr.map(n=>'0x' + n.toString(16))
现在,巡回数组可以来自字符串"255,255,255"
,可以将其按,
分割,也可以根据需要进行分类。如果要从字符串中拆分,则需要先解析。 (parseInt(n).toString(16)
)休息你需要根据需要实施。
示例代码:
var arr = [255, 230, 255];
var hexArr = arr.map(n=>'0x' + n.toString(16));
console.log(hexArr);
答案 2 :(得分:-1)
这个问题非常令人困惑。您需要在要解决问题的步骤中更具体。在第一段中,你说你希望最终解决方案是一个字节数组,但是在第二段你说你想要RGB到HEX但是想要整数?
你发布的输出是:fÿÿÿ。嗯,要获得此输出,然后您不希望从RGB转换为HEX到整数而不是您想要RGB到HEX到ASCII(FF =ÿ)。
你可以这样做(它有效,我已经在jsfiddle上测试过):
var parts = color.split(',');
var red = parts[0];
var green = parts[1];
var blue = parts[2];
// converts from integer to hex
var red = "0x"+ tohex(red);
var green = "0x" + tohex(green);
var blue = "0x" + tohex(blue);
// converts form hex to ascii
red = String.fromCharCode(red);
green = String.fromCharCode(green);
blue = String.fromCharCode(blue);
var output= red+green+blue;
// if the input (in this case you name it color) is: 255,255,255 you will get as output: ÿÿÿ
function tohex(rgb) {
if (rgb == 0) return "00"; // if the input is "0"
rgb = rgb.length < 2 ? "0" + rgb : rgb // RGB format validation
return rgb.toString(16);
}
这样简化:
var parts = color.split(',');
var red = parts[0];
var green = parts[1];
var blue = parts[2];
var red = String.fromCharCode("0x"+ tohex(red));
var green = String.fromCharCode("0x" + tohex(green));
var blue = String.fromCharCode ("0x" + tohex(blue));
var output= red+green+blue;
// if the input (in this case you name it color) is: 255,255,255 you will get as output: ÿÿÿ
function tohex(rgb) {
if (rgb == 0) return "00"; // if the input is "0"
rgb = rgb.length < 2 ? "0" + rgb : rgb // RGB format validation
return rgb.toString(16);
}
希望它有所帮助!